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

How to ensure const static member initialization order?

本文关键字:初始化 顺序 静态成员 const 何保证      更新时间:2023-10-16

我在常量静态字符串类成员的初始化顺序方面遇到问题。一些代码:

常量.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 将不起作用