我需要担心吗静态初始化顺序惨败 https://isocpp.org/wiki/faq/ctors#static-init-order当使用静态数据成员作为默认参数值时?例如:
class Thing {
static double const default_blarg; // initialized in another file
void run(double blarg=default_blarg);
};
I know default_blarg
将在链接时的大多数未指定点进行初始化,但我不确定何时默认参数run
已初始化。如果可能是之前的某个时刻default_blarg
已初始化,我可以使用什么方法来安全地将默认值公开为类接口的一部分而不重复它?会使用constexpr
对于静态数据成员是否安全?
请注意,我知道这可能会产生一些非常令人困惑的行为,如果default_blarg
不是 const (这就是它的原因),并且我没有尝试使用非静态数据成员。
您仍然需要担心静态初始化顺序的失败。假设您有 a.cpp 和 b.cpp。在a.cpp中你有
double const Thing::default_blarg = 0;
现在在 a.cpp 中任何调用run
在此之后,将会有一个初始化的默认值,您就可以开始了。不幸的是,在 b.cpp 中,您有另一个静态对象,它恰好创建了一个实例Thing
并打电话run
.
现在我们不知道会发生什么。如果 b.cpp 首先运行,那么default_blarg
未初始化,我们有未定义的行为。
现在为您介绍第二部分
但我不确定运行的默认参数何时初始化
每次调用函数时都会评估函数的默认参数。所以只要之后调用该函数default_blarg
已初始化(如上所述,可能不会),您会没事的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)