引用变量的默认初始化会在GCC 4.8中生成错误,但以下内容似乎在没有任何警告/错误的情况下编译和工作。
struct Foo {
int &bar;
Foo(): bar(bar) { }
};
int main () {
Foo foo;
cout << foo.bar; // prints 0
return 0;
}
这是如何编译的?我对这条线特别感到困惑:
Foo(): bar(bar) { }
答案 0 :(得分:4)
它不起作用,它是未定义的行为。
它编译是因为您通常可以在其初始化中引用变量。这可以有效用途:
void * p = &p;
但在大多数情况下会导致UB。如果启用了足够的警告,您应该收到有关使用未初始化值的警告。在海湾合作委员会中,-Wuninitialized
(或-Wall
)应该这样做。