我可以忽略gcc警告:'Foo :: m_bar'应该在成员初始化列表中初始化[-Weffc ++]

时间:2012-12-22 11:30:20

标签: c++ gcc c++11 compilation warnings

struct Bar
{
    Bar() {}
};


struct Foo
{
    Foo() = default;
    Bar m_bar;
};

int main()
{
    Foo foo;
}

使用C ++ 11 default关键字和gcc警告-Weffc++时,gcc输出:

  

警告:'Foo :: m_bar'应该在成员中初始化   初始化列表[-Weffc ++]

忽略此警告是否安全?我应该向gcc提交错误吗?

2 个答案:

答案 0 :(得分:27)

您可以忽略或取消警告。这是对有效C ++指南之一的误解。指南说更喜欢初始化到分配,但在您的示例中,m_bar将被初始化。你的代码是正确的。

来源:GCC的错误跟踪器中的Jonathan Wakely

  

#Item 12:首选初始化为构造函数中的赋值。

     

替换为第4项:“确保对象在它们之前被初始化   使用“,并且G ++误解了原始项目,并警告任何   没有mem-initializer的成员,这非常烦人:没有意义   初始化一个std :: string,它有一个非常安全的默认构造函数。我的    - PR 2972​​的Wminminit补丁应替换此项目的当前警告,   因为它只是警告成员没有被构造函数初始化。

(由于这是一个已知问题,因此无需再次将其报告为错误。)

答案 1 :(得分:5)

是否可以忽略此警告?是。

忽略此警告是一个好主意吗?取决于(*)

你应该向gcc提交一个错误吗?否(*)

(*)

  • default构造函数实际上初始化m_bar就好了,你可以测试一下
  • g ++没有得到那个
  • 有点奇怪
  • 您选择了非常详细的警告设置
  • 警告不是关于代码的正确性,而是关于样式
  • 你无法纠正这个并保留Foo的默认构造函数和Bar
  • 的自定义构造函数

man g++,部分-Weffc ++

  

警告Scott Meyers的Effective C ++书籍违反以下风格指南:

     
      
  • 第11项:为具有动态分配内存的类定义复制构造函数和赋值运算符。
  •   
  • 第12项:首选初始化为构造函数中的赋值。
  •   
  • 第14项:在基类中使析构函数虚拟化。
  •   
  • 第15项:让“operator =”返回对* this的引用。
  •   
  • 第23项:当您必须返回一个物体时,不要尝试返回参考。
  •   
     

还警告Scott Meyers的“更有效的C ++”一书中违反了以下风格指南:

     
      
  • 第6项:区分增量和减量运算符的前缀和后缀形式。
  •   
  • 第7项:永远不要超载“&&”,“││”或“,”。
  •   
     

选择此选项时,请注意标准库标题不符合所有这些准则。