Вот что я имею в виду: i++ + i++
не определено, и поэтому внеочередные записи записываются в массив.Являются ли некоторые неопределенные поведения более неопределенными, чем другие?
Неопределенность записей в виде внеочередных массивов понятна: потенциально может быть использована для запуска произвольного кода, который так же неопределен, как вы можете получить. Назовем это runtime undefined поведение.
Для i++ + i++
, однако, история кажется другой. Скажем, компилятор генерирует что-то. Не знаю, что именно. Очень неопределенно. На самом деле, это так неопределенно, что мы привыкли слышать, что кошки могут забеременеть (хотя совсем недавно - с CppCon 2016, я думаю - люди начали понимать, что неопределенное поведение не может получить кошку, беременную, в конце концов).
Однако, как только мы открываем коробку и см, что компилятор сгенерированный, и это не годная для использования коды (инъекции, гонки данных и т.д. - например, компилятор решил бросить i++ + i++
прочь вообще), ISN» t это именно то, что будет выполнено - разве это не определено с этой точки на?
Другими словами, этот последний случай - это то, что мы можем назвать время неопределенного времени компиляции. В условиях кошки он похож на Schrödinger's cat, состояние которого неизвестно , пока вы не откроете коробку (см. Сгенерированную сборку), после чего вы увидите фактическую реальность, которая будет выполнена. (Интересно, если неопределенное поведение сделать отравлен мертвый кот беременна.)
Конечно, неопределенного поведения является правового термина означал для стандарта. Речь идет о «поведении», которое происходит в действительности.
С точки зрения стандарта C++ все это не имеет значения. – jotik
«Не совсем ли это определено на этой точке» - НЕТ, вы не можете вернуть кошку в поле –
Не определено ... ну, «неопределено» для стандарта языка C++. Конечно, компиляторы и реализации библиотек могут реализовать четко определенное поведение в некоторых или большинстве случаев, но это формально неопределенное поведение для стандарта. – roalz