可能重复:
是自初始化'A a = a;' 允许吗?
考虑以下代码:
int main()
{
int x = x;
return 0;
}
它编译吗?好吧,我认为不会,但根据我的gcc-4.2.1确实如此。该值未指定,因为它只是声明int x;
。
但是,它有一些重要的后果,例如:
int x = 44;
int main()
{
int x = x;
return 0;
}
x
inmain
仍未指定,因为第三个是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中的错误、完全有效的行为还是某种灰色区域?
(无论如何,调试真的很痛苦。)