无法访问 C++ 中全局变量的构造函数中的静态(非原始)成员

Clo*_*all 2 c++ constructor stl initialization global-variables

当使用例如 int 而不是 std::string、std::map 等时,以下代码可以正常工作。

我有一个全局变量,在使用默认构造函数时需要静态成员的条目,但这里该字符串为空。变量“test”不必位于类本身内部。我认为 STL 组件(或非基元)涉及一些初始化顺序问题。使用 C++14。

// MyClass.h
#include <string>

class MyClass{
public:
    static const std::string test;
    MyClass();
};
Run Code Online (Sandbox Code Playgroud)
// MyClass.cpp
#include <iostream>
#include "MyClass.h"

const std::string MyClass::test = "Yooooooo";

MyClass::MyClass(){
    std::cout << test << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
// main.cpp
#include <iostream> 
#include "MyClass.h"

const MyClass c;

int main(){
    //MyClass c; // Would work
    std::cout << "There should be something above this line." << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 5

具有静态存储持续时间的对象在不同编译单元中相对于彼此初始化的顺序是无序的。

来自 C++ 14 标准(3.6.2 非局部变量的初始化)

  1. ...否则,变量的初始化相对于不同翻译单元中定义的变量的初始化是不确定的。

您有两个在不同编译单元中具有静态存储持续时间的变量

const std::string MyClass::test = "Yooooooo";
Run Code Online (Sandbox Code Playgroud)

const MyClass c;
Run Code Online (Sandbox Code Playgroud)

您可以通过使用内联说明符声明变量来避免该问题。

class MyClass {
public:
    inline static const std::string test = "Yooooooo";
    MyClass();
};
Run Code Online (Sandbox Code Playgroud)