Подтвердить что ты не робот

Что это означает, что объект существует на С++?

[class.dtor]/15 читает, акцент мой:

Как только деструктор вызывается для объекта, объект больше не существует; поведение undefined, если деструктор вызывается для объекта, срок жизни которого закончился (3.8).

Однако, насколько я могу судить, это единственная ссылка в стандарте на объект "существующий". Это также, по-видимому, контрастирует с [basic.life], что более конкретно:

Время жизни объекта типа T заканчивается, когда:

  • if T - это тип класса с нетривиальным деструктором (12.4), начинается вызов деструктора или

  • хранилище, которое объект занимает, повторно используется или освобождается.

Здесь мы имеем два разных формулировки: "время жизни объекта заканчивается" и "объект больше не существует", первое происходит только с нетривиальным деструктором, а последнее происходит с любым деструктором. В чем смысл различия? Что такое объект, который больше не существует?

4b9b3361

Ответ 1

Цитата из формулировки, по-видимому, подразумевает, что компилятор может правильно вставить код, который возвращает память, связанную с объектом, в кучу в начале своего деструктора. Но это устраняет способность объекта ссылаться на свои собственные члены во время разрушения, что требуется, если объект должен сам уничтожить себя.

Поэтому я думаю, что цитированная формулировка нарушена и должна быть исправлена.

Относительно того, что означает "жизнь" и "существование", я предлагаю, чтобы были разные контексты, в которых они означают разные вещи:

В контексте построения время жизни и существования начинаются с начала конструктора. Вне этого контекста они начинаются, когда заканчивается конструктор.

В контексте разрушения время жизни и существование заканчиваются, когда деструктор заканчивается. Вне этого контекста они заканчиваются, когда начинается разрушение.

Таким образом, объект может ссылаться на своих членов во время построения и потенциально передавать себя на функции других объектов, которые могут ссылаться на объект и его членов, и так далее. Но в целом объекты (экземпляры классов) могут не ссылаться (без создания поведения undefined) до тех пор, пока не закончится один из их конструкторов.

И деструктор объекта может ссылаться на свои собственные члены и вызывать функции других (существующих) объектов, которые могут ссылаться на уничтожаемый объект и/или его членов. Но, вообще говоря, объект не может ссылаться после запуска деструктора.

Такое многоконтекстное определение имеет для меня наибольший смысл, но я могу видеть, что аргументы в том, что объект должен считаться живым с момента, когда память выделяется для него до момента освобождения памяти, и я бы сказал, что память для мелкой копии должна быть выделена для объекта, когда один из его конструкторов запускается и освобождается, когда заканчивается его деструктор.