C++ 我是否可以忽略gcc警告:‘;Foo:m#u bar’;应在成员初始化列表[-Weffc+;+;]中初始化

C++ 我是否可以忽略gcc警告:‘;Foo:m#u bar’;应在成员初始化列表[-Weffc+;+;]中初始化,c++,gcc,c++11,compilation,warnings,C++,Gcc,C++11,Compilation,Warnings,使用C++11default关键字和gcc警告-Weffc++时,gcc输出: 警告:应在成员中初始化“Foo::m_bar” 初始化列表[-Weffc++] 忽略此警告是否安全?我应该向gcc提交错误吗?您可以忽略或抑制警告。这是一个有效的C++准则的误解。指南中说,与赋值相比,您更喜欢初始化,但在您的示例中,m_bar将被初始化。你的代码是正确的 来源:在GCC的bug跟踪器中: #第12项:首选构造函数中的初始化而不是赋值 替换为第4项:“确保对象在启动之前已初始化 “已使用”,并且G++

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

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


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

您可以忽略或抑制警告。这是一个有效的C++准则的误解。指南中说,与赋值相比,您更喜欢初始化,但在您的示例中,
m_bar
将被初始化。你的代码是正确的

来源:在GCC的bug跟踪器中:

#第12项:首选构造函数中的初始化而不是赋值

替换为第4项:“确保对象在启动之前已初始化 “已使用”,并且G++会错误地解释原始项,并警告任何错误 没有mem初始值设定项的成员,这很烦人:没有意义 初始化std::string时,它有一个非常安全的默认构造函数。我的 -PR 2972的Wmeminit修补程序应替换此项的当前警告, 因为它只警告构造函数未初始化的成员


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

忽略此警告可以吗?对

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

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

(*)

  • default
    构造函数实际上初始化了
    m_bar
    很好,您可以测试它
  • g++不明白这一点有点奇怪
  • 您选择了非常详细的警告设置
  • 警告不是关于代码的正确性,而是关于样式
  • 您无法更正此问题,并保留Foo的默认构造函数和Bar的自定义构造函数
MANG++
,第节-Weffc++

关于Scott Meyers《有效C++书:

违反以下风格指南的警告》
  • 第11项:为具有动态分配内存的类定义复制构造函数和赋值运算符
  • 第12项:首选构造函数中的初始化而不是赋值
  • 第14项:使析构函数在基类中成为虚拟的
  • 第15项:让“operator=”返回对*的引用
  • 第23项:当必须返回对象时,不要尝试返回引用

也警告从Scott Meyers更有效的C++书中违反以下风格指南:

  • 第6项:区分递增运算符和递减运算符的前缀和后缀形式
  • 第7项:切勿超载“&&”││", 或“,”
选择此选项时,请注意标准库标题不符合所有这些准则


“我应该向gcc提交一个bug吗”-不。当你认为这是一个编译器bug时,它就不是了。如果我这样做,我就看不到警告=默认值。遗憾的是没有向下投票的评论…不幸的是,
-Weffc++
目前并没有真正有用。这是唯一一个没有出现在我每个项目上使用的大量警告列表中的警告:@MatthieuM,除了错误否定!
struct Bar
{
    Bar() {}
};


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

int main()
{
    Foo foo;
}