如何保证 const 静态成员初始化顺序
How to ensure const static member initialization order?
我在常量静态字符串类成员的初始化顺序方面遇到问题。一些代码:
常量.h
class Constants
{
public:
// not used right now
Constants& getInstance();
const static std::string CONST_STRING;
};
常量.cpp
const std::string Constants::CONST_STRING = "my string";
Constants& Constants::getInstance();
{
static Constants c;
return c;
}
这是经典的常量静态初始化(忽略getInstance
(。但是,如果我随后尝试在另一个翻译单元的其他地方使用此常量,如下所示:
class OtherClass
{
public:
OtherClass()
{
// tried uncommenting next line
// Constants::getInstance();
std::string str( Constants::CONST_STRING );
std::cout << str;
}
}
OtherClass obj; // note global
CONST_STRING
为空,即它已被构造但未初始化。我知道全局初始化顺序不是跨翻译单元定义的,我猜这样的事情在这里适用?
但是,删除注释掉的行,该行试图确保在使用常量之前完全构造(我认为不需要它,但试一试......(仍然不能解决问题。
问题:
- 如何确保在任何人尝试使用常量静态成员之前完全初始化它们?
- 这是将常量与类相关联的最佳 C++11 方法吗?
constexpr
可以在这里使用的东西吗?
翻译单元中全局变量的初始化将发生在该翻译单元内的隐藏代码中。您无法控制调用这些隐藏代码位的顺序。
具有基本数据类型的常量可以在编译时而不是运行时初始化,因此这将起作用:
const char Constants::CONST_STRING[] = "my string";
也许这就是你要找的:
const std::string & GetConstantsString(){
static const std::string CONST_STRING = "My string";
return CONST_STRING;
}
正如@AndreyT指出的那样,文字类型 const static 只允许具有类内初始值设定项,所以我的选项 #1 将不起作用
相关文章:
- lambda 作为接受其他参数的参数的初始化顺序
- 大括号或等于初始值设定项初始化顺序
- C++ 模板中的静态常量初始化顺序
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 销毁 pthread 互斥体和 C++ 中的取消初始化顺序
- 线程局部变量的初始化顺序
- 类静态变量初始化顺序
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- 解析 CRTP 初始化顺序
- 内联初始化的静态 const 类成员的初始化顺序保证
- 使用constexpr的全局初始化顺序
- 初始化与类类型相同的静态成员(静态初始化顺序问题)
- 为什么结构属性声明和初始化顺序的行为是这样的?
- 影响初始化顺序(以C++为单位)
- MSVC 2017 在单个翻译单元中违反静态初始化顺序
- C++11 成员类初始化顺序
- 同一函数中的静态函数变量初始化顺序
- 静态内联成员初始化顺序
- C++静态初始化顺序:添加到映射中
- 静态成员的静态阵列:初始化顺序惨败的可能性