2 votes

Que fait c++ pour `my_map[i] = my_map.size()` ?

std::map<int, int> my_map;
my_map[0] = my_map.size();

Alors, est-ce que my_map[0] sea 0 o 1 ou indéfini ?

7voto

Öö Tiib Points 4755

Il n'y a aucune garantie, sauf si votre compilateur fournit des garanties. La norme C++ ne le fait pas.

Si vous avez besoin my_map.operator [](0) évalué d'abord, puis écrit :

int& m0 = my_map[0]; 
m0 = my_map.size();

Si vous avez besoin de la my_map.size() évalué d'abord, puis écrit :

int s = my_map.size();
my_map[0] = s;

6voto

oldrinb Points 10991

Il y a non point de séquence ici l'ordre d'évaluation n'est donc pas spécifié (ou, en jargon C++11, les deux expressions sont séquençage indéterminé ). La valeur de my_map[0] es 0 o 1 en fonction de la mise en œuvre.

  • my_map[0] augmentera la taille si elle est évaluée en premier, ce qui entraînera une augmentation de la taille de l'image. my_map.size() évaluer évaluer 1 . my_map[0] sera alors 1 .
  • Toutefois, si my_map.size() est évaluée en premier, puis la valeur de my_map[0] sera 0 .

Maintenant, comment faire pour que le comportement ci-dessus se produise bien défini ? Il faut introduire un point de séquence, c'est-à-dire forcer une expression à être séquencée avant l'autre ; pour un comportement comme le premier,

int& val = my_map[0];
val = my_map.size();

... ou, pour un comportement comme le second,

int sz = my_map.size();
my_map[0] = sz;

Ne manquez pas d'attribuer un "upvote" à Oo Tiib pour avoir été le premier à montrer comment introduire le séquençage pour les expressions :-)

4voto

AndreyT Points 139512

Votre

my_map[0] = my_map.size();

est équivalent à

my_map.operator [](0) = my_map.size();

l'opérateur d'affectation étant l'affectation intégrée pour int .

Il n'est pas précisé quel côté de l'affectation intégrée est évalué en premier. C'est pourquoi il n'est pas précisé si c'est 0 ou 1 qui sera attribué.

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