对象在C++中存在意味着什么?

Bar*_*rry 30 c++ object-lifetime language-lawyer c++11 c++14

[class.dtor]/15读取,强调我的:

一旦为对象调用析构函数,该对象就不再存在 ; 如果为生命周期结束的对象调用析构函数,则行为未定义(3.8).

但是,据我所知,这是标准中对"现有"对象的唯一引用.这似乎与[basic.life]形成鲜明对比,后者更具体:

类型对象的生命周期在以下情况T结束:

  • 如果T是具有非平凡析构函数(12.4)的类类型,则析构函数调用将启动,或者

  • 对象占用的存储器被重用或释放.

我们在这里有两个不同的措辞:"对象的生命周期结束"和"对象不再存在",前者只发生在一个非平凡的析构函数中,后者发生在任何析构函数中.差异的意义是什么?一个物体不再存在的含义是什么?

Sha*_*ais 1

引用的措辞似乎暗示编译器可以正确插入代码,将与对象关联的内存返回到析构函数开头的堆。但这样做会消除对象在销毁期间引用其自身成员的能力,如果对象要能够销毁自身,则需要这样做。

所以我认为引用的措辞已被破坏,应该予以修复。

关于“一生”和“存在”的含义,我认为有一些不同的上下文,它们的含义是不同的:

在构造的上下文中,生命周期和存在从构造函数开始时开始。在该上下文之外,它们在构造函数结束时开始。

在破坏的背景下,当析构函数结束时,生命周期和存在也结束。在这种背景之外,当破坏开始时,它们就会结束。

因此,一个对象可能在构造过程中引用它自己的成员,并可能将其自身传递给其他对象的函数,这些函数可能引用该对象及其成员,等等。但一般来说,对象(类的实例)在其构造函数之一完成之前可能不会被引用(不会产生未定义的行为)。

并且对象的析构函数可以引用它自己的成员并调用其他(现有)对象的函数,这可以引用被销毁的对象和/或其成员。但一般来说,一个对象在其析构函数启动后可能不会被引用。

这种多上下文定义对我来说是最有意义的,但我可以看到有人提出这样的论点:从为对象分配内存到释放内存的那一刻,对象应该被视为活动的,并且我会说浅拷贝的内存应该在对象的构造函数之一启动时为其分配,并在其析构函数结束时释放。