Поведение, определяемое реализацией, и неопределенное поведение
Стандарт C ++ очень специфичен в отношении эффектов различных конструкций, и, в частности, вы всегда должны знать об этих категориях проблем :
Неопределенное поведение означает, что нет никаких гарантий. Код может работать, или он может поджечь ваш жесткий диск или заставить демонов вылететь из вашего носа . Что касается языка C ++, то может случиться абсолютно все. На практике это обычно означает, что у вас есть неисправимая ошибка. Если это произойдет, вы не можете действительно доверять ничего о приложении (потому что один из эффектов этого непредсказуемого поведения может просто быть напутают памяти , используемых в остальной части вашего приложения). Необязательно быть последовательным, поэтому повторный запуск программы может дать разные результаты. Это может зависеть от фаз луны, цвета рубашки, которую вы носите, или чего-то еще.
Неопределенное поведение означает, что программа должна делать что-то разумное и последовательное, но не требуется документировать это.
Поведение, определяемое реализацией, аналогично неопределенному, но также должно быть задокументировано авторами компилятора. Примером этого является результат reinterpret_cast
. обычно он просто изменяет тип указателя, не изменяя адрес, но отображение фактически определяется реализацией, поэтому компилятор может отображать совершенно другой адрес, если он задокументировал этот выбор. Другой пример - размер int. Стандарт C ++ не заботится о том, составляет ли он 2, 4 или 8 байтов, но он должен быть задокументирован компилятором.
Но общим для всего этого является то, что их лучше избегать. По возможности придерживайтесь поведения, которое на 100% определяется самим стандартом C ++. Таким образом, вам гарантирована портативность.
Вам также часто приходится полагаться на поведение, определяемое реализацией. Это может быть неизбежно, но вы все равно должны обращать на это внимание и помнить, что вы полагаетесь на то, что может измениться между разными компиляторами.
С другой стороны, следует всегда избегать неопределенного поведения . В общем, вы должны просто предположить, что это заставит вашу программу так или иначе взорваться.