Sì. I valori nei contenitori STL devono mantenere la semantica della copia. IOW, devono comportarsi come tipi primitivi (ad esempio int) il che significa, tra le altre cose, che dovrebbero essere costruibili in modo predefinito.
Senza questo (e altri requisiti) sarebbe inutilmente difficile implementare le varie operazioni interne di copia / spostamento / scambio / confronto sulle strutture dati con cui sono implementati i contenitori STL.
In riferimento allo standard C ++, vedo che la mia risposta non era accurata. La costruzione predefinita, infatti, non è un requisito :
Dalla 20.1.4.1:
Il costruttore predefinito non è richiesto. Alcune firme della funzione membro della classe contenitore specificano il costruttore predefinito come argomento predefinito. T () deve essere un'espressione ben definita ...
Quindi, in senso stretto, il tipo di valore deve essere costruibile di default solo se ti capita di utilizzare una funzione del contenitore che utilizza il costruttore di default nella sua firma.
I requisiti reali (23.1.3) da tutti i valori memorizzati nei contenitori STL sono CopyConstructiblee Assignable.
Ci sono anche altri requisiti specifici per contenitori particolari, come l'essere Comparable(ad esempio per le chiavi in una mappa).
Per inciso, il seguente viene compilato senza errori su comeau :
#include <map>
class MyClass
{
public:
MyClass(int t);
};
int main()
{
std::map<int, MyClass> myMap;
}
Quindi questo potrebbe essere un problema di g ++.