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