49 votes

Le constructeur par défaut de std::pair<> définit-il les types de base (int, etc.) à zéro ?

Après avoir écrit :

 std::pair<int, int> x;

Suis-je assuré que x.first et x.second sont tous les deux nuls ? Ou pourraient-ils avoir une valeur ?

La raison pour laquelle je m'en soucie est que j'essaie de déterminer si une carte dont les valeurs sont des pointeurs est garantie de renvoyer NULL si j'accède à un élément qui n'est pas dans la carte. C'est-à-dire, si je fais :

 std::map<int, void*> my_map;
std::cout << int(my_map[5]) << std::endl;

alors suis-je assuré d'obtenir zéro (NULL) ? Ou le comportement est-il indéfini ?

6voto

Praetorian Points 47122

A partir de la norme C++11, paragraphe § 20.3.2

 constexpr pair();
...
Effects: Value-initializes first and second.

Il est donc bien défini que l'initialisation par défaut d'un objet std::pair<int, int> entraînera la mise à 0 des deux membres.

4voto

René Richter Points 1657

Oui, ils sont initialisés à zéro. Une citation de "The C++ Programming Language" de Bjarne Stroustrup (3e éd., Ch. 17.4.1.7) :

Le résultat de m[k] est équivalent au résultat de (*(m.insert(make_pair(k,V())).first)).second , où V() est la valeur par défaut du type mappé. Lorsque vous comprenez cette équivalence, vous comprenez probablement les conteneurs associatifs.

Pour les citations standard, ce que signifie initialisé par défaut, regardez les autres réponses.

2voto

Gunther Fox Points 3990

Oui, pair appellera les constructeurs par défaut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X