Поскольку существует путаница в семантике соответствия, это правила для C++. C использует совершенно другую модель соответствия.
Неопределенное поведение — это оксюморон, означающий, что переводчик НЕ ваша программа может делать все, что ему заблагорассудится. Обычно это означает, что он может генерировать код, который также будет делать все, что ему заблагорассудится (но это вывод). Там, где в Стандарте указано, что поведение не определено, текст на самом деле не имеет значения для пользователя в том смысле, что исключение этого текста не изменит требования, предъявляемые Стандартом к переводчикам.
Некорректная программа означает, что, если не указано иное, поведение транслятора жестко определено: требуется отклонить вашу программу и выдать диагностическое сообщение. Основным особым случаем здесь является правило одного определения, если вы нарушаете, что ваша программа плохо сформирована, но диагностика не требуется.
Определенная реализация налагает на переводчика требование, чтобы он содержал документацию, явно определяющую поведение. В этом особом случае результатом может быть Undefined Behavior, но это должно быть указано явно.
Unspecified — глупый термин, который означает, что поведение исходит из набора. В этом смысле хорошо определенное поведение — это всего лишь частный случай, когда набор разрешенных вариантов поведения содержит только один элемент. Unspecified не требует документации, поэтому в некотором смысле это также означает то же самое, что и реализация, определенная без документации.
В общем, стандарт C++ — это не стандарт языка, это модель для стандарта языка. Чтобы сгенерировать фактический стандарт, вы должны подключить различные параметры. Легче всего распознать ограничения, определенные реализацией.
В стандарте есть пара глупых конфликтов, например, законный транслятор может отклонить любую, казалось бы, хорошую программу на C++ на том основании, что вы должны предоставить функцию main()
, но транслятор поддерживает только идентификаторы из 1 символа. Эта проблема решается с помощью понятия QOI или качества реализации. По сути, это говорит о том, что никто не собирается покупать этот компилятор только потому, что он соответствует требованиям.
Технически неопределенный характер operator <
, когда указатели относятся к несвязанным объектам, вероятно, означает: вы получите какой-то результат, который является либо истинным, либо ложным, но ваша программа не рухнет, однако это не правильное значение неуказанного, поэтому это Дефект: не указано наложило бремя на разработчиков стандартов по документированию набора разрешенных вариантов поведения, потому что, если набор открыт, то это эквивалентно неопределенному поведению.
На самом деле я предложил std::less
как решение проблемы, заключающейся в том, что некоторые структуры данных требуют полного упорядочения ключей, а указатели не полностью упорядочены operator <
. На большинстве машин, использующих линейную адресацию, less
совпадает с <
, но операция less
, скажем, на процессоре x86 потенциально дороже.
person
Yttrill
schedule
06.02.2011
if (this != &other)
- person UncleBens   schedule 06.02.2011==
должно быть истинным только в том случае, если оба они являются нулевыми указателями или ссылаются на один и тот же объект (и обратное для!=
, конечно). - person Jerry Coffin   schedule 06.02.2011