Tak. Wartości w kontenerach STL muszą zachowywać semantykę kopiowania. IOW, muszą zachowywać się jak typy pierwotne (np. Int), co oznacza między innymi, że powinny być domyślnie konstruowane.
Bez tego (i innych wymagań) niepotrzebnie trudno byłoby zaimplementować różne wewnętrzne operacje kopiowania / przenoszenia / zamiany / porównania na strukturach danych, z którymi zaimplementowano kontenery STL.
Po odwołaniu się do standardu C ++ widzę, że moja odpowiedź nie była dokładna. Konstrukcja domyślna nie jest w rzeczywistości wymogiem :
Od 20.1.4.1:
Domyślny konstruktor nie jest wymagany. Niektóre podpisy funkcji składowej klasy kontenera określają domyślny konstruktor jako argument domyślny. T () musi być dobrze zdefiniowanym wyrażeniem ...
Tak więc, mówiąc ściśle, twój typ wartości musi być domyślnym konstruowalnym tylko wtedy, gdy używasz funkcji kontenera, która używa domyślnego konstruktora w swoim podpisie.
Rzeczywiste wymagania (23.1.3) ze wszystkich wartości przechowywanych w kontenerach STL to CopyConstructible
i Assignable
.
Istnieją również inne specyficzne wymagania dla poszczególnych kontenerów, takie jak istnienie Comparable
(np. Dla kluczy na mapie).
Nawiasem mówiąc, następujące kompilacje bez błędu na comeau :
#include <map>
class MyClass
{
public:
MyClass(int t);
};
int main()
{
std::map<int, MyClass> myMap;
}
Więc może to być problem g ++.