在声明中为变量赋予变量

时间:2012-06-29 23:38:15

标签: c++

  

可能重复:
  Is self-initialization 'A a = a;' allowed?

请考虑以下代码:

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 中的错误,完全有效的行为还是灰色区域?

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

0 个答案:

没有答案