Ist das Indizieren eines neuen Kartenelements und das Zuweisen von Lesevorgängen zu einem undefinierten Verhalten oder nur eine unbestimmte Aufgabe?

Nachdem ich geantwortet habediese FrageEs gab eine lange Diskussion darüber, ob der fragliche Code undefiniertes Verhalten war oder nicht. Hier ist der Code:

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

Zunächst wurde festgestellt, dass dies zumindest nicht spezifiziert war. Das Ergebnis hängt davon ab, welche Seite der Zuweisung zuerst bewertet wird. In meiner Antwort verfolgte ich jeden der vier resultierenden Fälle mit Faktoren, welche Seite zuerst bewertet wird und ob das Element vorher existiert.

Es gab auch eine kurze Form:

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

Ich habe behauptet, es sei eher so:

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

Schließlich fand ich ein Beispiel, das für mich zu funktionieren schien:

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

Zurück zum Original habe ich es in relevante Funktionsaufrufe unterteilt, um die Verfolgung zu vereinfachen:

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

Obword_count["a"] nicht existiert, wurde argumentiert, dass es zweimal ohne eine Sequenzierung dazwischen zugewiesen werden würde. Ich persönlich habe nicht gesehen, wie das passieren kann, wenn zwei Dinge, von denen ich dachte, dass sie wahr sind, tatsächlich sind:

Wenn eine Seite zur Bewertung ausgewählt wird, muss die gesamte Seite bewertet werden, bevor die andere Seite beginnen kann.

Konstrukte wie word_count ["a"] = 1 weisen ein genau definiertes Verhalten auf, selbst wenn ein Element eingefügt und dann zugewiesen wird.

Sind diese beiden Aussagen wahr? Letztendlich ist das tatsächlich undefiniertes Verhalten, und wenn ja, warum funktioniert die zweite Anweisung (sofern dies der Fall ist)? Wenn der zweite falsch ist, glaube ich allenmyMap[i]++;s in der Welt wäre schlecht geformt.

Hilfreicher Link:Undefiniertes Verhalten und Sequenzpunkte

Antworten auf die Frage(2)

Ihre Antwort auf die Frage