Подтвердить что ты не робот

Какая разница в поведении undefined между С++ 03 и С++ 11?

Новый стандарт имеет другое поведение undefined от старого. Например, новые правила секвенирования означают, что теперь определены некоторые арифметические операции, которые раньше были undefined (по таким причинам, как множественная запись между точками последовательности).

Итак, что нам нужно узнать заново о поведении undefined?

4b9b3361

Ответ 1

По-моему, новые правила сложнее описывать и понимать. Например, рассмотрим, что:

int x = 12;
x = x++ + 1; // undefined behaviour
x = ++x + 1; // valid

Я бы предложил просто избегать множественных побочных эффектов для одной и той же переменной в том же выражении, которое проще понять. AFAIK С++ 0X изменил некоторые случаи, которые были в прошлом undefined, и которые в настоящее время являются законными (например, второе из двух выражений выше), но помните, что существует и всегда будет разница между тем, что является законным и что морально;-)... никто не заставляет вас использовать такие вещи.

Фактически в приведенном выше случае кажется, что действие второго выражения произошло непреднамеренно как побочный эффект исправления другой проблемы (# 222) на языке. Решение состояло в том, чтобы сделать выражение действительным, потому что считалось, что изменение чего-то от UB до четко определенного не наносит никакого вреда. Я думаю, однако, что, хотя это и не наносило ущерба программам (где, конечно же, UB является наихудшей возможной проблемой), это фактически наносило некоторый ущерб самому языку... изменяя правило, которое было уже сложно объяснить и понять еще более неясным.

IMO С++ продолжает свою естественную эволюцию от C до языка, где множество красивых и логичных операторов может делать замечательные вещи... и в которых еще одна группа одинаково красивых, одинаково хороших и одинаково логических утверждений может заставить ваш компьютер взорваться вместо этого.

Ответ 2

С++ 0x меняет число ранее undefined дел до условно поддерживаемых случаев. Семантика:

  • Если реализация не поддерживает условно-поддерживаемую функцию, она должна документировать это и должна выдать диагностику для программы, которая ее нарушает.
  • Если реализация поддерживает его, он должен вести себя к дополнительным требованиям, которые Стандарт делает на нем. Например, стандарт может сказать, что что-то условно поддерживается семантикой, определенной реализацией. Если это так, реализация должна документировать, как она поддерживает эту функцию.

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