C ++标准对于对象生命周期的意义是什么?

时间:2013-12-05 20:02:11

标签: c++ standards language-lawyer

在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.

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

最后一句是什么意思?是在初始化列表完成初始化时还是在构造函数体完成运行时?或者最后一句话是否意味着什么呢?

3 个答案:

答案 0 :(得分:3)

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

  

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

一旦身体执行完毕,初始化就完成了。

答案 1 :(得分:0)

  

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

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

#include <iostream>

struct Stillborn
{
    Stillborn()
    {
        std::cout << "inside constructor\n";
        throw 42;
    }

    ~Stillborn()
    {
        std::cout << "inside destructor\n";
    }
};

int main()
{
    try
    {
        Stillborn x;
    }
    catch (...)
    {
        std::cout << "inside catch block\n";
    }
}

live demo。请注意“内部析构函数”如何不出现在输出中。

答案 2 :(得分:0)

有一张纸条:

  

&#34; [注意:通过简单的复制/移动构造函数初始化是   非平凡的初始化。 - 尾注]&#34;

这意味着当普通构造函数完成执行时。