Поскольку существует путаница в семантике соответствия, это правила для C ++. C использует совершенно другую модель соответствия.
Неопределенное поведение - оксюморонный термин, это означает, что * переводчик НЕ ваша программа, может делать все, что пожелает. Как правило, это означает, что он может генерировать код, который также будет делать все, что пожелает (но это вычет). Если в стандарте говорится, что поведение не определено, текст на самом деле не имеет значения для пользователя в том смысле, что исключение этого текста не изменит требований, предъявляемых стандартом к переводчикам.
Плохо сформированная программа означает, что, если не указано иное, поведение переводчика жестко определено: требуется отклонить вашу программу и выдать диагностическое сообщение.
Основным особым случаем здесь является Правило единого определения, если вы нарушаете, что ваша программа некорректна, но диагностика не требуется.
Определенная реализация налагает на переводчика требование, чтобы он содержал документацию, явно указав поведение. В этом особом случае результатом может быть неопределенное поведение, но оно должно быть явно указано.
Unspecified - это глупый термин, который означает, что поведение происходит из набора. В этом смысле четко определенный просто особый случай, когда набор разрешенных поведений содержит только один элемент. Unspecified не требует документации, поэтому в некотором смысле это также означает то же самое, что и реализация, определенная без документации.
В целом, стандарт C ++ не является языковым стандартом, это модель для языкового стандарта. Чтобы сгенерировать актуальный стандарт, вы должны подключить различные параметры. Самым простым из них является ограничение, определяемое реализацией.
В Стандарте есть пара глупых конфликтов, например, законный переводчик может отклонить каждую явно хорошую программу на C ++ на том основании, что вам необходимо предоставить функцию main()
, но переводчик поддерживает только идентификаторы из 1 символа. , Эта проблема решается понятием QOI или качеством реализации. В основном говорится, кого это волнует, никто не собирается покупать этот компилятор только потому, что он соответствует.
Технически, неопределенная природа operator <
, когда указатели относятся к несвязанным объектам, вероятно, имеет в виду: вы получите какой-то результат, который будет либо истинным, либо ложным, но ваша программа не будет аварийно завершена, однако это не правильно значение «неопределенное», то есть дефект: «неопределенное» наложило на авторов стандартов бремя документирования набора разрешенных вариантов поведения , поскольку, если набор открыт, то он эквивалентен неопределенному поведению.
Я фактически предложил std::less
в качестве решения проблемы, согласно которой некоторые структуры данных требуют, чтобы ключи были полностью упорядочены, но указатели не полностью упорядочены по operator <
. На большинстве машин с использованием линейной адресации less
совпадает с <
, но операция less
, скажем, на процессоре x86 потенциально более дорогая.