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 编译没有错误。它是否能够推迟静态变量的初始化,直到第一次调用或未定义行为更有可能发生为止?
我知道,如果它有效,静态值可能会从调用该方法的第一个对象中选取。
是否能够将静态变量的初始化推迟到第一次调用
这实际上是局部静态变量初始化的时刻。更具体地说,当执行第一次到达声明点时,就会发生初始化。
或者未定义的行为更有可能?
示例中没有 UB。
为什么 gcc 接受将方法内的静态变量初始化为对象的字段?
因为这样做是很好的。
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |