C++标准关于对象生存期的含义是什么
What does the C++ standard mean regarding object lifetime begins?
在第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";
}
}
现场演示。请注意"内部析构函数"是如何不出现在输出中的。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- 有什么方法可以延长C++中临时对象的生存期吗
- 临时实例的生存期是多少
- 由放置新创建的平凡类型的生存期从什么时候开始?
- thread_local 和 std::future 对象 - 对象的生存期是多少
- 范围内临时对象的生存期是多少?
- 封闭环变量的生存期和范围是什么
- 作为参数立即传递的对象生存期是多少
- 临时绑定到引用参数的默认参数的生存期是多少
- C++标准关于对象生存期的含义是什么
- 块内变量的生存期是多少
- 在c++中,没有变量名的构造函数调用的生存期/作用域是什么?
- 单例类的成员变量的生存期是多少?
- 什么决定临时变量的生存期何时扩展为常量引用或重值引用
- 成员函数中的变量生存时间,值不断重置为“0”,原因是什么
- std::string::c_str()的结果的生存期是多少