初始化参考成员本身合法吗?

时间:2010-04-08 13:24:48

标签: c++

这是我在使用Valgrind的服务器应用程序中发现的错误。

struct Foo
{
    Foo(const std::string& a)
        : a_(a_)
    {
    }
    const std::string& a_;
};

使用gcc -Wall你没有得到警告。 为什么这个合法代码?

2 个答案:

答案 0 :(得分:2)

你所得到的内容违反了8.3.2/4 A ... reference shall be initialized to refer to a valid object or function。所以这当然是非法的。

请注意,并非所有错误的程序都需要被编译器检测到,尽管老实说我会认为这是其中之一。

对于它的价值,启用了最大编译器警告的g ++版本4.4.1很高兴地接受了这个程序而没有警告:

int main(void)
{   
    int *p = 0;
    *p = 5;
}

答案 1 :(得分:0)

在C / C ++中允许自我赋值(我认为这是语言中的一个缺陷)。

从内存模型的角度来看,Foo :: a_只是一些内存位置,在初始化列表中,它被分配了另一个内存位置的值,在这种特殊情况下,不幸的是它位于相同的位置。

C中存在类似的缺陷,您可以这样做:

  void foo() 
  {
    int i = i;
  }