C++警告,用于检测参考字段自身的初始化

Dre*_*kes 1 c++ gcc compiler-warnings c++11

我有一个错误的复制构造函数导致的错误,它从自身初始化它的字段:

Foo(const Foo& rhs)
  : bar(bar)      // error
{}
Run Code Online (Sandbox Code Playgroud)

显然这应该是:

Foo(const Foo& rhs)
  : bar(rhs.bar)
{}
Run Code Online (Sandbox Code Playgroud)

是否有可以检测到这种情况的编译器诊断?这段代码有可能有意义吗?

-Winit-self 似乎没有抓住这一点.

编辑

感谢永远的代码示例是显示警告由GCC 4.9.2提供的,我挖得更深一些,以确定为什么我没有看到一个.

事实证明,它取决于被复制字段的类型.

class A
{
public:
   A(const A&) : a(a), b(b), c(c) {}
private:
   int a;
   int* b;
   int& c;
};
Run Code Online (Sandbox Code Playgroud)

此代码仅提供有关a(按值复制)和b(通过指针)的警告,但提供c(通过引用).

现在已知这一点,是否仍然有理由期待GCC将自我引用的初始化视为一个问题?

Clang确实将所有这三个标识为警告,提供b:

在此处使用时,引用'b'尚未绑定到某个值

编辑我在GCC的bug跟踪器中打开了一个问题:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64667

For*_*veR 5

在gcc中你可以使用flag Winit-self(至少在gcc v 4.8.2 flag上捕获这种情况),或者只是Wall.在clang中,它默认启用,通过标志Wuninitialized.

这里尝试了gcc 4.9.2 .有警告.