Czy indeksowanie nowego elementu mapy i posiadanie czegoś, co go odczytuje, przypisuje mu niezdefiniowane zachowanie lub po prostu nieokreślone?

Po odpowiedzito pytanie, trwała długa dyskusja na temat tego, czy dany kod był niezdefiniowanym zachowaniem, czy nie. Oto kod:

std::map<string, size_t> word_count;
word_count["a"] = word_count.count("a") == 0 ? 1 : 2;

Przede wszystkim ustalono, że było to co najmniej nieokreślone. Wynik różni się w zależności od tego, która strona przypisania jest oceniana jako pierwsza. W mojej odpowiedzi podążyłem za każdym z czterech wynikowych przypadków, z czynnikami, które strony są oceniane jako pierwsze i czy element istnieje przed tym.

Pojawiła się również krótka forma:

(x = 0) = (x == 0) ? 1 : 2; //started as
(x = 0) = (y == "a") ? 1 : 2; //changed to

Twierdziłem, że było to bardziej:

(x = 0, x) = (x == 0) ? 1 : 2; //comma sequences x, like [] should

W końcu znalazłem przykład, który wydawał mi się skuteczny:

i = (++i,i++,i); //well-defined per SO:Undefined Behaviour and Sequence Points

Wracając do oryginału, rozbiłem go na odpowiednie wywołania funkcji, aby ułatwić śledzenie:

operator=(word_count.operator[]("a"), word_count.count("a") == 0 ? 1 : 2);
   ^       inserts element^                        ^reads same element
   |
assigns to element

Jeśliword_count["a"] nie istnieje, twierdzono, że zostanie on przypisany dwukrotnie bez sekwencjonowania między nimi. Osobiście nie widziałem, jak mogłoby się to stać, gdyby dwie rzeczy, które uważałem za prawdziwe, były w rzeczywistości:

Po wybraniu strony do oceny cała strona musi zostać oceniona przed rozpoczęciem drugiej strony.

Konstrukcje takie jak word_count ["a"] = 1 wykazują dobrze zdefiniowane zachowanie, nawet w przypadku, gdy element jest wstawiany, a następnie przypisywany do.

Czy te dwa stwierdzenia są prawdziwe? Ostatecznie, czy jest to właściwie niezdefiniowane zachowanie, a jeśli tak, to dlaczego druga instrukcja działa (zakładając, że tak)? Jeśli drugi jest fałszywy, wierzę wszystkimmyMap[i]++;s na świecie byłyby źle ukształtowane.

Pomocne łącze:Niezdefiniowane zachowanie i punkty sekwencji

questionAnswers(2)

yourAnswerToTheQuestion