为什么在声明对象时可以使用它?

时间:2019-04-15 19:30:49

标签: c++ language-lawyer declaration undefined-behavior

我偶然发现了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绝对不可能被初始化。

0 个答案:

没有答案