После ответа this question продолжилось обсуждение того, был ли этот код неопределенным поведением или нет. Вот код:Является ли индексирование нового элемента карты и что-то, что читает ему, присвоенное ему неопределенное поведение или просто неуказанное?
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]++;
в мире будут плохо сформированы.
Полезные ссылки: Undefined behavior and sequence points
Связанный с этим вопрос в контексте C: http://stackoverflow.com/questions/13935904/is-xyyx-undefined-or-unspecified-and-if-unspecified-what-can-it –
@PascalCuoq, Спасибо, это кажется очень актуальным. Вопрос в том, сохраняет ли это значение для C++ (это почти наверняка делает) и распространяется ли это на создание нового элемента на карте. – chris
Кажется, что есть много вызовов функций, которые вводят точки последовательности повсюду. С другой стороны, если результат все еще не определен, каково практическое использование выражения? –