Это странный аспект правил жизни C ++. [basic.life] / 1 сообщает нам , что время жизни объекта заканчивается:
- , если
T
- это тип класса с нетривиальным деструктором ([class.dtor]), начинается вызов деструктора, или - хранилище, которое занимает объект, освобождается или повторно используется объектом, который не вложен в o ([intro.object]).
Акцент добавлен.int
не является «типом класса с нетривиальным деструктором», поэтому его время жизни заканчивается только когда освобождается занимаемое им хранилище.Напротив, A
является типом класса с нетривиальным деструктором ", поэтому его время жизни заканчивается, когда вызывается деструктор.
Хранилище для области освобождается при выходе из области в соответствии с [basic.stc.auto] / 1 :
Хранение [переменных с автоматическим хранением] длится до выхода из блока, в котором они созданы.
Но автоматические переменные уничтожаются в соответствии с [stmt.jump] / 2 :
При выходе из области действия (хотя и выполнено), объекты с длительностью автоматического хранения, которыебыли сконструированы в этом объеме и уничтожаются в порядке, обратном их построению.
Обратите внимание, что указан порядок уничтожения, но порядок автоматического освобождения хранилища равен , а не .Это означает, что реализация может освободить хранилище сразу после уничтожения каждой переменной, либо освободить все сразу, либо в произвольном другом порядке.
Теперь,тот факт, что он использует единственное число для хранения («хранилище для ... длится») вместо того, чтобы говорить о каждой переменной в отдельности, может указывать на то, что цель состоит в том, чтобы хранилище в целом было сразу освобождено для этой области.Но в стандарте нет явного заявления об этом.Таким образом, до тех пор, пока переменная уничтожается до освобождения ее хранилища, любой порядок уничтожения и выпуска представляется законным.
Это означает, что код может полностью работать, а n
пережитьa
.Но неизвестно, работает ли .