В C++ появляются вещи, находящиеся где-то между четко определенными и неопределенными. В частности, они называются реализация определена и не определена. Сейчас меня интересуют неуказанные вещи.
Когда можно использовать такие функции, а когда их следует избегать? Есть ли хорошие примеры неопределенного поведения, являющегося частью правильного кода? Когда, если вообще когда-либо, это лучший выбор при написании программного обеспечения?
Определения предоставлены Мэттом Макнаббом:
Не определено - может случиться что угодно
Определяется реализацией - возможно конечное количество результатов, и в документации компилятора должно быть указано, что происходит.
Не указано — возможно конечное число результатов — обычно Стандарт описывает набор возможных результатов.
Четко определено - ничего из вышеперечисленного
Хорошо сформированная программа - программа, которая компилируется без ошибок (может демонстрировать неопределенное поведение)
Дополнительный вопрос:
Считаются ли расслабленные атомы неопределенными или четко определенными?
int arr[5]{}; someCondition ? arr[0] : arr[10];
? Извините, это единственное, что я могу придумать навскидку, и оно не очень полезно ни для чего, кроме категоризации. - person chris   schedule 18.07.2014union { ... } a = {23};
, а затем пытаетесь ввести доступ к каламбуруa.b
- person Brandin   schedule 18.07.2014char
является известным исключением из этого правила, IIRC. - person Lightness Races in Orbit   schedule 18.07.2014int main() { int x; x *= 0; return x; }
. Поведение этой программы явно не определено, но я был бы удивлен, обнаружив любую реализацию, которая не создает исполняемый файл, который всегда возвращает 0. - person Brandin   schedule 18.07.2014x
перед функцией. Это может привести к сбою (см. Архитектура Itanium, NaT) - person Deduplicator   schedule 18.07.2014nullptr
— это неопределенное поведение, и точка. - person πάντα ῥεῖ   schedule 18.07.2014