На самом деле ...
C ++ имеет то, что называется принципом «как будто». Все гарантии, указанные во всех этих ответах, относятся только к наблюдаемому поведению. Компилятору разрешается указывать, переупорядочивать, добавлять и т. Д. Любой вызов функции, если наблюдаемое поведение такое же, как если бы оно выполнялось так, как было написано изначально. Это относится и к деструкторам.
Итак, технически ваше наблюдение верно: компилятору разрешено уничтожить объект раньше, если он обнаружит, что он не используется, и нет никаких видимых побочных эффектов от деструктор или любая функция, которую он вызывает. Но вы гарантированно не сможете сказать, что это происходит вне отладчика, потому что, если бы вы могли сказать, компилятор больше не смог бы это сделать.
Скорее всего, компилятор использует эту мощь, чтобы сделать что-то полезное, например, полностью объяснить тривиальный деструктор, а не переупорядочивать вызовы деструктора.
Редактировать: Кто-то хотел ссылку ... 1.9 / 5 вместе со сноской 4 чернового стандарта C ++ 0x (это не новое правило, у меня просто нет Удобный стандарт C ++ 03. Он также присутствует в стандарте C, AFAIK)
1,9 / 5:
Соответствующая реализация, выполняющая правильно сформированную программу, должна производить то же наблюдаемое поведение
в качестве одной из возможных последовательностей выполнения соответствующего экземпляра абстрактной машины с
та же программа и тот же вход. Однако, если любая такая последовательность выполнения содержит неопределенную операцию,
В этом международном стандарте нет требований к выполнению этой программы с этим
ввод (даже в отношении операций, предшествующих первой неопределенной операции).
Сноска 4:
Это положение иногда называют правилом «как будто», потому что реализация может свободно игнорировать любое требование этого
Международном стандарте до тех пор, пока результат будет соответствовать требованию, насколько это можно определить из
наблюдаемое поведение программы. Например, фактическая реализация не должна оценивать часть выражения, если она может
сделать вывод, что его значение не используется и что не возникает никаких побочных эффектов, влияющих на наблюдаемое поведение программы.
Мое чтение (и то, что я считал общим пониманием) состояло в том, что это то, что позволяет свободной руке компилятора делать все, что он хочет (т. Е. Позволяет оптимизировать), при условии, что наблюдаемое поведение соответствует исходному письменному источнику - включая движение вокруг деструкторов, отсутствие разрушения объектов, изобретение деструкторов и т. д.