C++标准关于对象生存期的含义是什么

What does the C++ standard mean regarding object lifetime begins?

本文关键字:生存期 是什么 对象 标准 于对象 C++      更新时间:2023-10-16

在第3.8.1节的n3690 C++标准中,有这样的文本:

The lifetime of an object of type T begins when:
— storage with the proper alignment and size for type T is obtained, and
— if the object has non-trivial initialization, its initialization is complete.

假设有一个用户定义的构造函数。

最后一句是什么意思?它是在初始化器列表完成初始化时,还是在构造函数主体完成运行时?还是最后一句话有别的意思?

12.6.2,[class.base.init],第6项列出了初始化步骤,这是最后一个:

最后,执行构造函数主体的复合语句

因此,一旦主体执行完毕,初始化就完成了。

有一个注释:

"[注意:通过简单的复制/移动构造函数进行初始化是非琐碎的初始化。--尾注]"

这意味着琐碎的构造函数将在何时完成执行。

当构造函数主体完成运行时

这个。在构造过程中抛出的对象不能保证其不变量已建立,因此其生存期不会开始。这样做的结果是,析构函数将不会被调用:

#include <iostream>
struct Stillborn
{
    Stillborn()
    {
        std::cout << "inside constructorn";
        throw 42;
    }
    ~Stillborn()
    {
        std::cout << "inside destructorn";
    }
};
int main()
{
    try
    {
        Stillborn x;
    }
    catch (...)
    {
        std::cout << "inside catch blockn";
    }
}

现场演示。请注意"内部析构函数"是如何不出现在输出中的。