在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.
假设有一个用户定义的构造函数。
最后一句是什么意思?是在初始化列表完成初始化时还是在构造函数体完成运行时?或者最后一句话是否意味着什么呢?
答案 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;
这意味着当普通构造函数完成执行时。