Ja. Werte in STL-Containern müssen die Kopiersemantik beibehalten. IOW, sie müssen sich wie primitive Typen (z. B. int) verhalten, was unter anderem bedeutet, dass sie standardmäßig konstruierbar sein sollten.
Ohne diese (und andere Anforderungen) wäre es unnötig schwierig, die verschiedenen internen Operationen zum Kopieren / Verschieben / Austauschen / Vergleichen in den Datenstrukturen zu implementieren, mit denen STL-Container implementiert sind.
Unter Bezugnahme auf den C ++ - Standard sehe ich, dass meine Antwort nicht korrekt war. Die Standardkonstruktion ist in der Tat keine Voraussetzung :
Ab 20.1.4.1:
Der Standardkonstruktor ist nicht erforderlich. Bestimmte Funktionssignaturen von Containerklassenmitgliedern geben den Standardkonstruktor als Standardargument an. T () muss ein genau definierter Ausdruck sein ...
Genau genommen muss Ihr Wertetyp nur dann standardmäßig konstruierbar sein, wenn Sie zufällig eine Funktion des Containers verwenden, der den Standardkonstruktor in seiner Signatur verwendet.
Die tatsächlichen Anforderungen (23.1.3) an alle in STL-Containern gespeicherten Werte sind CopyConstructibleund Assignable.
Es gibt auch andere spezifische Anforderungen für bestimmte Container, z. B. Comparable(z. B. für Schlüssel in einer Karte).
Übrigens wird folgendes auf comeau fehlerfrei kompiliert :
#include <map>
class MyClass
{
public:
MyClass(int t);
};
int main()
{
std::map<int, MyClass> myMap;
}
Dies könnte also ein G ++ - Problem sein.