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

发布于 2025-01-12 09:22:55 字数 738 浏览 1 评论 0 原文

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

我有一个全局变量,在使用默认构造函数时需要静态成员的条目,但该字符串在这里为空。变量“test”不必位于类本身内部。我认为 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;
}

The following code works fine when using e.g. int instead of std::string, std::map etc.

I have a global variable that needs an entry of the static member when using the default constructor, but this string is empty here. The variable "test" does not have to be inside the class itself. I think there is some initialization order problem involved with STL components (or non-primitives). Using 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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吾家有女初长成 2025-01-19 09:22:55

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

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

  • ...否则,变量的初始化是不确定的
    相对于中定义的变量的初始化进行排序
    不同的翻译单元。
  • 您在不同的编译单元中有两个具有静态存储持续时间的变量

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

    const MyClass c;
    

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

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

    The order in which objects with the static storage duration are initialized in different compilation units relative to each other is unsequenced.

    From the C++ 14 Standard (3.6.2 Initialization of non-local variables)

    1. ...Otherwise, the initialization of a variable is indeterminately
      sequenced with respect to the initialization of a variable defined in
      a different translation unit.

    You have two variables with static storage duration in different compilation units

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

    and

    const MyClass c;
    

    You could avoid the problem by declaring the variable with the inline specifier.

    class MyClass {
    public:
        inline static const std::string test = "Yooooooo";
        MyClass();
    };
    
    ~没有更多了~
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文