首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我能不能忽略gcc的警告:‘Foo::m_bar’应该在成员初始化列表[-Weffc++]中初始化

我能不能忽略gcc的警告:‘Foo::m_bar’应该在成员初始化列表[-Weffc++]中初始化
EN

Stack Overflow用户
提问于 2012-12-22 19:30:20
回答 2查看 9.4K关注 0票数 22
代码语言:javascript
复制
struct Bar
{
    Bar() {}
};


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

int main()
{
    Foo foo;
}

使用C++11 default keyword和gcc warning -Weffc++时,gcc输出:

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

忽略此警告是否安全?我是不是应该把bug提交给gcc?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-22 19:46:13

您可以忽略或禁止显示警告。这是对有效的C++指南之一的误解。指南说首选初始化而不是赋值,但在您的示例中,m_bar将被初始化。您的代码是正确的。

来源:GCC的bug跟踪器中的Jonathan Wakely

第12项:在构造函数中首选初始化而不是赋值。替换为第4项:“确保对象在使用前已初始化”,G++无论如何都会曲解原始项,并警告任何没有mem初始化器的成员,这非常恼人:初始化std::string是没有意义的,它有一个绝对安全的默认构造函数。我的PR2972的-Wmeminit补丁应该会替换这个项目的当前警告,因为它只警告未被构造函数初始化的成员。

(因为这是一个已知的问题,所以没有必要再次将其报告为bug。)

票数 29
EN

Stack Overflow用户

发布于 2012-12-22 20:02:56

可以忽略此警告吗?是。

忽略这个警告是个好主意吗?依赖(*)

你是不是应该把bug提交给gcc?否(*)

(*)

  • default构造函数实际上可以很好地初始化setting
  • warning,你可以测试它有点奇怪,g++没有得到你选择的
  • 非常冗长的警告setting
  • warning不是关于代码的正确性,而是关于样式
  • 你不能纠正这一点,并保留
  • 的默认构造函数和g++

的自定义构造函数

man g++,-Weffc++节

警告违反斯科特·迈尔斯的《Effective C++》一书中的以下风格准则:

  • 第11项:为具有动态分配内存的类定义复制构造函数和赋值运算符。
  • 第12项:在constructors.
  • Item 14中优先使用初始化而不是赋值。
  • 15:让"operator=“返回对*this的引用。
  • 第23项:在必须返回对象时不要尝试返回引用。

同时警告违反Scott Meyer的“More Effective C++”一书中的以下风格准则:

  • 第6项:区分递增和递减的前缀和后缀形式operators.
  • Item 7:
    • "&&“、"││”或",“。

选择此选项时,请注意标准库头文件并不遵守所有这些准则。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14002454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档