Поведінка, визначена реалізацією та Не визначена поведінка
Стандарт C ++ дуже специфічний щодо впливу різних конструкцій, і, зокрема, ви завжди повинні бути в курсі цих категорій проблем :
Невизначена поведінка означає, що гарантій абсолютно не дано. Код може спрацювати, або він може підпалити ваш жорсткий привід або змусити демонів вилетіти з вашого носа . Що стосується мови C ++, то може статися абсолютно все. На практиці це, як правило, означає, що у вас непоправна помилка. Якщо це трапиться, ви не можете дійсно довіряти чомусь своєму додатку (тому що одним із наслідків цього невизначеного поведінки може бути просто зіпсувати пам'ять, яку використовує решта вашого додатка). Це не потрібно, щоб бути послідовним, тому запуск програми двічі може дати різні результати. Це може залежати від фаз місяця, кольору сорочки, яку ви носите, або абсолютно нічого іншого.
Довільні означає поведінку , що програма повинна робити що - то SANE і послідовним, але це не обов'язково документувати це.
Поведінка, визначена реалізацією, є подібною до не визначеної, але її також слід документувати авторами-упорядниками. Прикладом цього є результат а reinterpret_cast. Зазвичай він просто змінює тип вказівника, не змінюючи адресу, але відображення насправді визначено реалізацією, тому компілятор міг би відобразити зовсім іншу адресу, доки він задокументував цей вибір. Інший приклад - розмір int. Стандарт C ++ не має значення, якщо він становить 2, 4 або 8 байт, але він повинен бути задокументований компілятором
Але загальним для всього цього є те, що їх найкраще уникати. Коли це можливо, дотримуйтесь поведінки, яка на 100% визначена самим стандартом C ++. Таким чином, ви гарантуєте портативність.
Вам часто доводиться покладатися і на певну поведінку, визначену реалізацією. Це може бути неминучим, але все ж слід звернути на це увагу і пам’ятати, що ви покладаєтесь на те, що може змінюватися між різними компіляторами.
З іншого боку, невизначеної поведінки завжди слід уникати. Загалом, ви просто повинні припустити, що це змушує вашу програму вибухати так чи інакше.