C++ 字符串常量和静态初始化顺序惨败

Mik*_*ney 5 c++ static-initialization c++11

我试图了解静态初始化顺序失败何时是一个真正的问题。如果我使用如下所示的字符串常量,kName它会遇到静态初始化顺序失败的问题吗?Derived在这种情况下这是一个问题吗,因为可以在kName初始化之前创建的实例,如 中 所示main.cpp

// Base.cpp
namespace test {
class Base {
public:
  virtual ~Base() = default;

protected:
  explicit Base(const std::string &name);
};
} // namespace test

// Derived.cpp
namespace test {
static const std::string kName = "my name";

class Derived : public Base {
public:
  Derived() : Base(kName) {}
  ~Derived() override = default;
};
} // namespace test

// main.cpp
int main() {
  test::Derived instance{};
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 2

main在初始化所有“全局”变量之前,不会调用该函数。这包括static成员变量以及namespace作用域内(static或不在作用域内)的变量。

所以在这种情况下,这没有问题,因为你定义了函数instance内部main

如果 的定义是在函数instance外部静态完成的,情况会有所不同main