我偶然发现了this question中的一行代码。可以归结为
#include <iostream>
struct foo {
int x;
foo(int a) : x(a) {}
};
int main() {
foo f(f.x); // UB !!
std::cout << f.x;
}
它会编译并显示警告:
prog.cc:9:14: warning: 'f.foo::x' is used uninitialized in this function [-Wuninitialized]
foo f(f.x);
请注意,问题https://wandbox.org/permlink/lNQWKWefobUtwD51
中的代码中没有产生这样的警告。现在我的问题有两个方面。抱歉,两人合二为一...
为什么f
甚至可以在声明之前使用?
在foo f(f.x);
中,f
何时声明? (f.x)
不是声明的一部分吗?我怎么可能将对象用作其构造函数的参数?
接下来,我知道存在未定义的行为是有原因的,但是我无法解决这种情况……
为什么C ++需要允许编写foo f(f.x);
?为什么/应该不是错误?
我可以想象正确的情况,即构造器采用引用或指针,并且在完全构建f
之前不使用它。但是,f.x
是通过值传递的,并且在初始化之前f.x
绝对不可能被初始化。