Это будет пример неопределенного поведения . Стандарт C ++ содержит много предложений, подобных этому: «Если (некоторое условие), результатом будет неопределенное поведение».
Почему существует неопределенное поведение? Разве это не усложняет ситуацию? Да, к сожалению, это все усложняет для программиста . Причина для UB состоит в том, чтобы упростить задачу для авторов компиляторов - либо упростить (или вообще возможно!) Написать компилятор в первую очередь, либо упростить компилятору оптимизацию, сделав определенные предположения.
По сути, существует множество правил, которые вы должны соблюдать при написании программ на C ++. Некоторые нарушения этих правил могут быть легко обнаружены компилятором во время компиляции, и для них язык требует, чтобы компилятор выдал сообщение об ошибке. Примером этого может быть синтаксическая ошибка.
Но существуют также нарушения, которые трудно или невозможно обнаружить компилятору. Примером этого может быть кусок памяти, который вы продолжаете использовать после того, как вы вызвали delete
для него. На самом деле теоретически невозможно написать программу, которая обнаружит все возможные подобные нарушения. Поэтому вместо того, чтобы просить авторов компилятора решить неразрешимую проблему обнаружения этих нарушений, стандарт C ++ просто объявляет, что ваша программа будет испытывать «неопределенное поведение», если вы это сделаете. Это означает, что вы не можете делать любое предсказание того, что произойдет - фактически стандартный пример состоит в том, что UB может заставить демонов вылететь из вашего носа .
[EDIT] На самом деле, как указывает litb, ваш конкретный случай - не пример неопределенного поведения, а поведения, определяемого реализацией , что немного более цивилизованно. :) В этой категории описываются случаи, когда авторы стандарта C ++ признают, что программист может разумно ожидать какого-то согласованного поведения, что не слишком сложно для разработчика компилятора, но требовать такого поведения было бы обременительным или контрпродуктивным. быть одинаковым на каждой реализации. (Например, sizeof (int)
определяется реализацией - хотя это часто 4 или 8, что касается стандарта C ++, единственное требование - >= sizeof (short)
.) Чтобы компилятор требовал соответствия стандарту, он должен задокументируйте конкретное поведение, которое будет иметь место для каждого сценария, помеченного как «определяемое реализацией поведение» в стандарте.