以下内容改编自代码:
void func()
{
static MyClass a = init_func();
a_global_var = null;
}
C ++编译器是否保证第一个赋值在第二个赋值之前?
答案 0 :(得分:3)
是。但我不禁想到为什么你需要依赖它。
第一次调用该函数时,a
初始化为init_func
在a_global_var
稍后设置为“null
”之前返回的任何内容
请注意,由于a
是静态的,所以这仅在第一次调用函数时发生。随后的所有时间a_global_var
都会设置为null
,而a
不会对此功能进行任何更改。
答案 1 :(得分:1)
第一行不是"赋值"。这是初始化。因为它是在块作用域中声明的静态对象的初始化,所以当控件第一次通过它时,即当你第一次调用你的函数时,它将只执行一次
第二行确实是一项任务。它将在每次控制传递时执行,即每次调用函数时都会执行。
这意味着您的问题仅在第一次调用此函数时才有意义。在这种情况下,保证初始化在赋值之前。在所有后续调用中,该问题根本不适用,因为不再执行初始化。
答案 2 :(得分:0)
" C ++编译器是否保证第一次分配在第二次分配之前?"
是的,它有保障。
无论如何,你应该考虑在单身中处理这个问题(如果你真的需要全局访问它):
class MyClass {
public:
static MyClass& instance() { // <<< replaces func()
static MyClass a;
return a;
}
void* global_var() { return a_global_var; }
private:
MyClass() : a_global_var(nullptr) { // <<< replaces init_func()
}
void* a_global_var;
};