一道最近的问题引起了我的关注,它涉及到C++14中
在这个补充之前,静态初始化的变量要么是引用类型,要么是字面对象类型,因此具有平凡析构函数。但是现在,静态初始化的全局变量可以具有非平凡的析构函数。
这样的析构函数调用与动态初始化的全局对象的析构函数、其他静态初始化的对象的析构函数的顺序如何,以及析构函数的调用顺序如何?
constexpr
如何改变。新特性是,如果一个具有静态存储期的非局部变量的初始化器由一个constexpr
构造函数组成,即使变量的类型不是字面类型,也可以在静态初始化阶段进行初始化。更准确地说,在[basic.start.init]中的新措辞为:
典型的例子是对象
o
的常量初始化器是指一个常量表达式,但它也可以调用o
及其子对象的constexpr构造函数,即使这些对象是非字面类类型[注意: 这样的类可能有一个非平凡的析构函数 - end note]。如果静态或线程存储期的对象通过构造函数调用进行初始化,并且初始化完整表达式是对象的常量初始化器,则执行常量初始化[...]。
std::unique_ptr
,它“不应该比手写更差”:std::unique_ptr<int> p; // statically initialized by [unique.ptr.single.ctor],
// requires no code excution
int main()
{
p = std::make_unique<int>(100);
}
// p is destroyed eventually
在这个补充之前,静态初始化的变量要么是引用类型,要么是字面对象类型,因此具有平凡析构函数。但是现在,静态初始化的全局变量可以具有非平凡的析构函数。
这样的析构函数调用与动态初始化的全局对象的析构函数、其他静态初始化的对象的析构函数的顺序如何,以及析构函数的调用顺序如何?
std::mutex
有一个constexpr
构造函数,以便利用静态初始化。) - T.C.