【发布时间】:2014-12-02 17:28:18
【问题描述】:
我遇到了 const 静态字符串类成员的初始化顺序问题。一些代码:
常量.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;
}
这是经典的 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 为空,即它已被构造但未初始化。我知道全局初始化顺序没有跨翻译单元定义,我猜类似的东西在这里适用?
但是,删除试图确保在使用之前完全构建常量的注释行(我不认为它是必需的,但试一试......)仍然不能解决问题。
问题:
- 如何确保在任何人尝试使用 const 静态成员之前对其进行完全初始化?
- 这是将常量与类关联的最佳 C++11 方法吗?
constexpr可以在这里使用吗?
【问题讨论】:
-
您的常量似乎实现了单例模式 - 为什么不让字符串通过单例访问?即使您的字符串成为成员并在单例的构造函数中对其进行初始化。
-
静态初始化命令惨败见this C++ FAQ entry。
-
getInstance()与CONST_STRING的初始化无关。而constexpr不是一个选项,因为basic_string构造函数不是constexpr。如果您想确保特定的顺序,您可以将CONST_STRING设为一个函数,该函数将const&返回给本地函数static std::string。 -
我可以使用带有 char[] 的 constexpr 吗?