programming - tag dispatch c++ что это




Какая разница в неопределенном поведении между C++ 03 и C++ 11? (2)

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

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


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

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

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


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

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

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

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

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







c++03