请考虑以下代码:
int main()
{
int x = x;
return 0;
}
编译吗?好吧,我认为它不会,但根据我的 gcc-4.2.1 。该值未指定,因为它只是说明int x;
。
但它有一些非平凡的后果,例如:
int x = 44;
int main()
{
int x = x;
return 0;
}
x
中的main
仍未指定,因为第三个x
是第二个(我知道我可以使用::x
克服它,但这不是重点)。
有人可以说int x = x;
在这种情况下相当于int x; x = x;
,但在使用适当的对象时情况变得更加复杂:
class S
{
public:
S(): x(44) { std::cout << "constructor" << std::endl; }
S(const S &s): x(s.x)
{ std::cout << "copy " << this << " " << &s << std::endl; }
int getx () const { return x; }
private:
int x;
};
int main()
{
S s(s);
std::cout << s.getx() << std::endl;
return 0;
}
上面的代码打印:
copy 0x7fff65ac1598 0x7fff65ac1598
0
显然,传递给复制构造函数的对象是一个未构造的垃圾袋(如果能够编译就不足为奇了。)
即使使用-Wall -Wextra
,我在编译时也不会收到任何警告。它是 gcc 中的错误,完全有效的行为还是灰色区域?
(无论如何,调试真的很痛苦。)