Oui. Les valeurs des conteneurs STL doivent conserver la sémantique de copie. IOW, ils doivent se comporter comme des types primitifs (par exemple int) ce qui signifie, entre autres, qu'ils doivent être constructibles par défaut.
Sans cela (et d'autres exigences), il serait inutilement difficile d'implémenter les diverses opérations internes de copie / déplacement / échange / comparaison sur les structures de données avec lesquelles les conteneurs STL sont implémentés.
En référence à la norme C ++, je vois que ma réponse n'était pas exacte. La construction par défaut n'est en fait pas une exigence :
À partir du 20.1.4.1:
Le constructeur par défaut n'est pas requis. Certaines signatures de fonction de membre de classe de conteneur spécifient le constructeur par défaut comme argument par défaut. T () doit être une expression bien définie ...
Donc, à proprement parler, votre type de valeur n'a besoin d'être constructible par défaut que si vous utilisez une fonction du conteneur qui utilise le constructeur par défaut dans sa signature.
Les exigences réelles (23.1.3) de toutes les valeurs stockées dans les conteneurs STL sont CopyConstructible
et Assignable
.
Il existe également d'autres exigences spécifiques pour des conteneurs particuliers, comme être Comparable
(par exemple pour les clés d'une carte).
Incidemment, ce qui suit compile sans erreur sur comeau :
#include <map>
class MyClass
{
public:
MyClass(int t);
};
int main()
{
std::map<int, MyClass> myMap;
}
Cela pourrait donc être un problème g ++.