如何确保const静态成员初始化顺序?

时间:2014-12-02 17:28:19

标签: c++ c++11

我遇到了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之前完全构造它(我不相信它是必需的但是给它一个去....)仍然没有解决问题。

问题:

  • 在任何人尝试使用const静态成员之前,如何确保它们完全初始化?
  • 这是使类与常量相关联的最佳C ++ 11方法吗? constexpr可以在这里使用吗?

2 个答案:

答案 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";