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

c++ string constant and static initialization order fiasco

我试图了解静态初始化顺序失败何时才是真正的问题。如果我使用像下面的 kName 这样的字符串常量,它会遇到静态初始化顺序失败的任何问题吗?在这种情况下这是一个问题吗,因为可以在 kName 初始化之前创建 Derived 的实例,如 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;
}

main 函数只有在所有 "global" 变量都初始化后才会被调用。这包括 static 成员变量以及 namespace 范围内的变量(static 或不)。

所以在这种情况下没问题,因为您在 main 函数中定义了 instance

如果 instance 的定义是在 main 函数之外静态完成的,那就不一样了。

在特定的翻译单元中,静态对象的初始化顺序保证是对象定义在该翻译单元中出现的顺序。销毁顺序保证与初始化顺序相反。 但是,无法保证跨翻译单元的静态对象的初始化顺序。这就是所谓的静态初始化顺序惨败。

所以在这里你不会有静态初始化顺序失败。