Индексирует ли новый элемент карты и имеет ли что-то, что читает его, назначенное ему неопределенное поведение, или просто неопределенное?

После ответаэтот вопросБыло долгое обсуждение того, является ли рассматриваемый код неопределенным поведением или нет. Вот код:

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

Прежде всего, было установлено, что это было по крайней мере не определено. Результат отличается в зависимости от того, какая сторона задания оценивается первой. В своем ответе я проследил каждый из четырех полученных случаев, указав факторы, какая сторона оценивается первой и существует ли элемент до этого.

Была также короткая форма:

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

Я утверждал, что это было больше похоже на это:

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

В конце концов, я нашел пример, который, казалось, работал на меня:

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

Возвращаясь к оригиналу, я разбил его на соответствующие вызовы функций, чтобы было легче следовать:

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

Еслиword_count["a"] не существует, утверждалось, что он будет назначен дважды без последовательности между ними. Я лично не видел, как это могло произойти, если бы две вещи, которые я считал правдой, были:

Когда выбирается сторона, подлежащая оценке, вся сторона должна быть оценена, прежде чем другая сторона может начать.

Такие конструкции, как word_count ["a"] = 1, демонстрируют четко определенное поведение даже в том случае, когда элемент вставляется и затем назначается.

Верны ли эти два утверждения? В конечном счете, это действительно неопределенное поведение, и если это так, то почему работает второе утверждение (если оно работает)? Если второе неверно, я считаю, что всеmyMap[i]++;в мире было бы плохо сформировано.

Полезная ссылка:Неопределенные точки поведения и последовательности

Ответы на вопрос(2)

Ваш ответ на вопрос