Да. Значения в контейнерах STL должны поддерживать семантику копирования. IOW, они должны вести себя как примитивные типы (например, int), что означает, среди прочего, что они должны быть сконструированы по умолчанию.
Без этого (и других требований) было бы излишне сложно реализовать различные внутренние операции копирования / перемещения / замены / сравнения структур данных, с которыми реализованы контейнеры STL.
После ссылки на стандарт C ++ я вижу, что мой ответ был неточным. По сути, конструкция по умолчанию не является требованием :
Начиная с 20.1.4.1:
Конструктор по умолчанию не требуется. Определенные сигнатуры функций-членов класса контейнера указывают конструктор по умолчанию в качестве аргумента по умолчанию. T () должно быть четко определенным выражением ...
Итак, строго говоря, ваш тип значения должен быть конструктивным по умолчанию только в том случае, если вы используете функцию контейнера, которая использует конструктор по умолчанию в своей подписи.
Реальные требования (23.1.3) для всех значений, хранящихся в контейнерах STL: CopyConstructibleи Assignable.
Существуют также другие особые требования к конкретным контейнерам, такие как Comparableналичие (например, для ключей на карте).
Между прочим, следующее компилируется без ошибок при комо :
#include <map>
class MyClass
{
public:
MyClass(int t);
};
int main()
{
std::map<int, MyClass> myMap;
}
Так что это может быть проблема g ++.