3

可能重复:
是自初始化'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;
}

xinmain仍未指定,因为第三个是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中的错误、完全有效的行为还是某种灰色区域?

(无论如何,调试真的很痛苦。)

4

0 回答 0