c++ - 当我通过静态函数访问静态成员时,是否会出现静态初始化顺序失败的情况?

标签 c++ static static-initialization

这个特定的代码是否容易出现静态初始化顺序失败? IE。当我访问 B 的静态成员函数时,我可以假设编译单元“B”中的静态初始化已经完成吗?

// a.h
struct A {
    static int foo();
    static int var;
}

// a.cpp
#include <a.h>
int A::foo() {
    return var;
}
int A::var = 42;


// b.h
struct B {
    B::B();
    static int var;
}

// b.cpp
#include <b.h>
#include <a.h>
B::B() {
    var = A::foo();
}

// c.h
struct C {
    static B b;
}

// c.cpp
B C::b;

或者我有这样的代码:

// a.h
static int &A::var();

// a.cpp
int &A::var() {
    static value = 42;
    return value;
}

int A::foo() {
    return var();
}

如果能引用该标准,我们将不胜感激。

最佳答案

是的,通过静态函数访问时您可以看到问题。
请参阅下面的示例,肯定会失败。

解决这个问题的方法是在 main 启动之前不要访问“静态存储持续时间对象”。

如果由于某种原因您需要从“静态存储持续时间对象”的构造函数访问对象,那么应该包装这些对象,以便您保证它们在使用之前已完全构造。最好的方法是使用“静态函数对象”(一种按需构造的静态存储持续时间对象)。

// a.cpp
MyType&  A::getInstance()
{
    static MyType myInstance;
    return myInstance;
}

保证失败的示例:

struct A
{
     static A  instanceA1;
     static A& getInstance() { return instanceA1;}
};

struct B
{
     static B instanceB1;
     static B& getInstance() { return instnaceB1;}
     A& member;

     B(): member(A::getInstance()) {}
}

B B::instanceB1;   // Constructure uses A::getInstance() which returns A::instance
                   // But A::instance has not been constructed yet.
                   // Order of instanciation in the same compilation unit is guranteed
                   // So we know this will not work.
A A::instanceA1;

关于c++ - 当我通过静态函数访问静态成员时,是否会出现静态初始化顺序失败的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6084222/

相关文章:

c++ - 为什么不能为冒泡排序设置一个循环?

c# - 如果不需要类成员,是否使用静态函数更好?

Java - 回到静态方法的继承

java - 静态初始值设定项不能在定义之前引用字段

java - 静态初始化

python - boost Python "cannot open source file ' pyconfig.h '"when importing using "#include <boost\python.hpp>"

C++ 查找 map 的第 N 个最高元素

c++ - Boost hana 在集合中查找类型

java - 为什么 JNI 在枚举中找不到自定义静态?

c++ - 如何理解在某些情况下允许实现将非局部变量的动态初始化视为静态初始化?