Говоря в контексте стандарта С++ 11 (который уже не имеет понятия точек последовательности, как вы знаете), я хочу понять, как определяются два простых примера.
int i = 0;
i = i++; // #0
i = ++i; // #1
На SO есть две темы, которые объясняют эти примеры в контексте С++ 11. Здесь сказано, что #0
вызывает UB и #1
. Здесь сказано, что оба примера: undefined. Эта двусмысленность меня смущает. Я читал эту хорошо структурированную reference три раза, но тема кажется слишком сложной для меня.
.
Проанализируем пример #0
: i = i++;
.
Соответствующие кавычки:
Вычисление стоимости встроенного постинкремента и постдекремента операторы секвенированы перед его побочным эффектом.
Побочный эффект (модификация левого аргумента) встроенного оператора присваивания и всех встроенных операторов присваивания секвенируется после вычисления значения (но не побочных эффектов) как левый, так и правый аргументы, и секвенирован до значения вычисление выражения присваивания (то есть до возвращения ссылка на измененный объект)
Если побочный эффект скалярного объекта не зависит от другого побочный эффект на том же скалярном объекте, поведение undefined.
Как я понял, побочный эффект оператора присваивания не секвенирован с побочными эффектами его левого и правого аргументов. Таким образом, побочный эффект оператора присваивания не секвенирован с побочными эффектами i++
. Итак, #0
вызывает UB.
.
Проанализируем пример #1
: i = ++i;
.
Соответствующие кавычки:
Побочный эффект встроенного преинкремента и предопределения операторы упорядочиваются до вычисления его значений (неявное правило, подлежащее для определения как составного назначения)
Побочный эффект (модификация левого аргумента) встроенного оператора присваивания и всех встроенных операторов присваивания секвенируется после вычисления значения (но не побочных эффектов) как левый, так и правый аргументы, и секвенирован до значения вычисление выражения присваивания (то есть до возвращения ссылка на измененный объект)
Если побочный эффект скалярного объекта не зависит от другого побочный эффект на том же скалярном объекте, поведение undefined.
Я не вижу, как этот пример отличается от #0
. Кажется, это UB для меня по той же причине, что и #0
. Побочный эффект присваивания не связан с побочным эффектом ++i
. Кажется, это UB. Приведенная выше тема говорит, что она четко определена. Почему?
.
Вопрос: как я могу применить котируемые правила для определения UB примеров. Было бы очень полезно получить как можно более простое объяснение. Спасибо!