C++ 字符串常量和静态初始化顺序惨败
c++ string constant and static initialization order fiasco
我试图了解静态初始化顺序惨败何时是一个真正的问题。如果我使用如下所示kName
字符串常量,它会遭受静态初始化顺序惨败的任何问题吗?在这种情况下这是一个问题,因为可以在初始化kName
之前创建Derived
的实例,如main.cpp
?
// Base.cpp
namespace test {
class Base {
public:
virtual ~Base() = default;
protected:
explicit Base(const std::string &name);
};
} // namespace test
// Derived.cpp
namespace test {
static const std::string kName = "my name";
class Derived : public Base {
public:
Derived() : Base(kName) {}
~Derived() override = default;
};
} // namespace test
// main.cpp
int main() {
test::Derived instance{};
return 0;
}
在所有"全局"变量初始化之前,不会调用 main
函数。这包括static
成员变量以及namespace
范围内的变量(static
与否(。
所以在这种情况下,这没有问题,因为您在main
函数中定义了instance
。
如果instance
的定义是在main
函数之外静态完成的,那就不一样了。
在特定翻译单元中,静态对象的初始化顺序保证是对象定义在该翻译单元中出现的顺序。销毁顺序保证与初始化顺序相反。但是,不能保证跨翻译单元初始化静态对象的顺序。这就是所谓的静态初始化订单惨败。
所以在这里你不会有静态初始化顺序惨败。
相关文章:
- lambda 作为接受其他参数的参数的初始化顺序
- 大括号或等于初始值设定项初始化顺序
- 类内初始化与构造函数初始化列表的顺序
- C++ 模板中的静态常量初始化顺序
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 构造函数中没有参数的对象类成员按什么顺序初始化?
- 销毁 pthread 互斥体和 C++ 中的取消初始化顺序
- 线程局部变量的初始化顺序
- 初始化值是否保证通过其自己的地址反映,而不考虑内存顺序
- 类静态变量初始化顺序
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- 解析 CRTP 初始化顺序
- 初始化相等C++的顺序
- 内联初始化的静态 const 类成员的初始化顺序保证
- 使用constexpr的全局初始化顺序
- 初始化与类类型相同的静态成员(静态初始化顺序问题)
- 结构化绑定的标识符是否按顺序初始化?
- c++中的求值顺序初始化数组
- c++标准和C语言在哪里说的是一样的:编译单元(.cpp文件)中的变量是按照声明的顺序初始化的