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