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



当使用例如int而不是std::string、std::map等时,以下代码运行良好。

我有一个全局变量,当使用默认构造函数时,它需要静态成员的条目,但这里的字符串是空的。变量";测试";不必在类本身内部。我认为STL组件(或非基元(存在一些初始化顺序问题。使用C++14。

// MyClass.h
#include <string>
class MyClass{
public:
static const std::string test;
MyClass();
};
// MyClass.cpp
#include <iostream>
#include "MyClass.h"
const std::string MyClass::test = "Yooooooo";
MyClass::MyClass(){
std::cout << test << std::endl;
}
// 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;
}

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

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

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

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

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

const MyClass c;

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

class MyClass {
public:
inline static const std::string test = "Yooooooo";
MyClass();
};

最新更新