Ответ 1
Это скорее зависит.
[C++11: 3.8/1]:
Время жизни объекта типаT
заканчивается, когда:
- Если
T
- это тип класса с нетривиальным деструктором (12.4), начинается вызов деструктора или- хранилище, которое объект занимает, повторно используется или освобождается.
Ясно, что это случай повторного использования.
и
[C++11: 3.8/4]:
Программа может завершить время жизни любого объекта за счет повторного использования хранилища, которое объект занимает, или путем явного вызова деструктора для объекта типа класса с нетривиальным деструктором. Для объекта типа класса с нетривиальным деструктором программа не требует прямого вызова деструктора до того, как хранилище, которое объект занимает, повторно используется или освобождается; , однако, если нет явного вызова деструктора или если выражение удаления (5.3.5) не используется для освобождения хранилища, деструктор не должен быть неявно вызван, и любая программа, зависящая от полученных побочных эффектов по деструктору имеет поведение undefined.
Таким образом, даже для типа, отличного от POD T
, он действителен, если ничто в вашей программе не зависело от того, что делал деструктор.
Это немного воздушно-фея, но это потенциально позволяет делать то, что вы делаете.
Обратите внимание, что эта снисходительность не распространяется на некоторые лишь несколько более странные случаи:
[C++11: 3.8/9]
: создание нового объекта в месте хранения, в котором используется объект const со статической, потоковой или автоматической продолжительностью хранения, или, в месте хранения, в котором такой объект const, который был занят до его окончания жизни, заканчивается результатами undefined поведение