为什么 gcc 接受将方法内的静态变量初始化为对象的字段?

h22*_*h22 0 c++ gcc object

class MyClass {
public:
    int obj_field;

    MyClass(int val) : obj_field(val) {}

    void myMethod() {
        static int my_static_var = obj_field;  // <--- Why is this okay?
        // ... 
    }
};
Run Code Online (Sandbox Code Playgroud)

我深信这是错误的,不应该编译,因为我确信它们只能初始化为 constexpr (假设值在执行开始之前初始化)。令我惊讶的是,它使用 gcc 9.4.0、C++17 编译没有错误。它是否能够推迟静态变量的初始化,直到第一次调用或未定义行为更有可能发生为止?

我知道,如果它有效,静态值可能会从调用该方法的第一个对象中选取。

eer*_*ika 5

是否能够将静态变量的初始化推迟到第一次调用

这实际上是局部静态变量初始化的时刻。更具体地说,当执行第一次到达声明点时,就会发生初始化。

或者未定义的行为更有可能?

示例中没有 UB。

为什么 gcc 接受将方法内的静态变量初始化为对象的字段?

因为这样做是很好的。

  • 可能还想补充一点,即使在多线程中,静态变量也保证只被初始化一次。 (3认同)