gpt4 book ai didi

c++ - 如何保证 const static 成员的初始化顺序?

转载 作者:行者123 更新时间:2023-11-30 03:58:49 26 4
gpt4 key购买 nike

我对 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 为空,即它已被构造但未初始化。我知道全局初始化顺序没有跨翻译单元定义,我猜类似的东西适用于这里?

然而,删除试图确保常量在使用前完全构建的注释行(我不认为它是必需的,但试一试......)仍然没有解决问题。

问题:

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

最佳答案

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

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

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

关于c++ - 如何保证 const static 成员的初始化顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27255403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com