Какая разница в неопределенном поведении между C ++ 03 и C ++ 11? - PullRequest
18 голосов
/ 07 декабря 2010

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

Ответы [ 2 ]

14 голосов
/ 07 декабря 2010

На мой взгляд, новые правила сложнее описать и понять.Например, учтите, что:

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

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

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

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

3 голосов
/ 12 декабря 2010

C ++ 0x изменяет количество ранее неопределенных наблюдений на теперь условно поддерживаемых наблюдений. Семантика:

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

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

...