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提交错误吗?
答案 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
就好了,你可以测试一下 man g++
,部分-Weffc ++
警告Scott Meyers的Effective C ++书籍违反以下风格指南:
- 第11项:为具有动态分配内存的类定义复制构造函数和赋值运算符。
- 第12项:首选初始化为构造函数中的赋值。
- 第14项:在基类中使析构函数虚拟化。
- 第15项:让“operator =”返回对* this的引用。
- 第23项:当您必须返回一个物体时,不要尝试返回参考。
还警告Scott Meyers的“更有效的C ++”一书中违反了以下风格指南:
- 第6项:区分增量和减量运算符的前缀和后缀形式。
- 第7项:永远不要超载“&&”,“││”或“,”。
选择此选项时,请注意标准库标题不符合所有这些准则。