Так. Значення в контейнерах 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 ++.