【问题标题】:How to ensure const static member initialization order?如何保证 const 静态成员初始化顺序?
【发布时间】: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&amp; 返回给本地函数static std::string
  • 我可以使用带有 char[] 的 constexpr 吗?

标签: c++ c++11


【解决方案1】:

翻译单元内的全局变量的初始化将发生在该翻译单元内的隐藏代码中。您无法控制调用这些隐藏代码的顺序。

具有基本数据类型的常量可以在编译时而不是运行时初始化,所以这会起作用:

const char Constants::CONST_STRING[] = "my string";

【讨论】:

    【解决方案2】:

    也许这就是你要找的东西:

    const std::string & GetConstantsString(){
        static const std::string CONST_STRING = "My string";
        return CONST_STRING;
    }
    

    正如@AndreyT 所指出的,文字类型 const static only 被允许具有类内初始化器,因此我的选项 #1 将不起作用

    【讨论】:

    • 我不认为选项 1 有效,即使有效,也解决不了任何问题。并且选项2中的返回类型应该是std::string const&amp;
    • 呃...只有 literal type const 静态成员才允许有类内初始化器。 std::string 不是文字类型。您的“第一选择”在该语言中不存在。
    • @AndreyT 该死的语言忘记了,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    相关资源
    最近更新 更多