Индексирует ли новый элемент карты и имеет ли что-то, что читает его, назначенное ему неопределенное поведение, или просто неопределенное?
После ответаэтот вопросБыло долгое обсуждение того, является ли рассматриваемый код неопределенным поведением или нет. Вот код:
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]++;
в мире было бы плохо сформировано.
Полезная ссылка:Неопределенные точки поведения и последовательности