我遇到了const静态字符串类成员的初始化顺序问题。一些代码:
constants.h
class Constants
{
public:
// not used right now
Constants& getInstance();
const static std::string CONST_STRING;
};
constants.cpp
const std::string Constants::CONST_STRING = "my string";
Constants& Constants::getInstance();
{
static Constants c;
return c;
}
这是经典的const静态初始化(忽略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
为空,即它已构建但未初始化。我知道全局初始化顺序没有在翻译单元中定义,我猜这样的东西适用于这里吗?
然而,删除注释掉的行,试图确保在使用Constants之前完全构造它(我不相信它是必需的但是给它一个去....)仍然没有解决问题。
问题:
constexpr
可以在这里使用吗?答案 0 :(得分:1)
也许这就是你要找的东西:
const std::string & GetConstantsString(){
static const std::string CONST_STRING = "My string";
return CONST_STRING;
}
正如@AndreyT指出的那样,文字类型const static only 允许使用类内初始值设定项,因此我的选项#1将无效
答案 1 :(得分:1)
翻译单元中全局变量的初始化将发生在该翻译单元中的隐藏代码中。您无法控制将要调用这些隐藏代码的顺序。
基本数据类型的常量可以在编译时而不是运行时初始化,所以这可以工作:
const char Constants::CONST_STRING[] = "my string";