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?
发布于 2012-12-22 19:46:13
您可以忽略或禁止显示警告。这是对有效的C++指南之一的误解。指南说首选初始化而不是赋值,但在您的示例中,m_bar
将被初始化。您的代码是正确的。
来源:GCC的bug跟踪器中的Jonathan Wakely:
第12项:在构造函数中首选初始化而不是赋值。替换为第4项:“确保对象在使用前已初始化”,G++无论如何都会曲解原始项,并警告任何没有mem初始化器的成员,这非常恼人:初始化std::string是没有意义的,它有一个绝对安全的默认构造函数。我的PR2972的-Wmeminit补丁应该会替换这个项目的当前警告,因为它只警告未被构造函数初始化的成员。
(因为这是一个已知的问题,所以没有必要再次将其报告为bug。)
发布于 2012-12-22 20:02:56
可以忽略此警告吗?是。
忽略这个警告是个好主意吗?依赖(*)
你是不是应该把bug提交给gcc?否(*)
(*)
default
构造函数实际上可以很好地初始化setting的自定义构造函数
man g++
,-Weffc++节
警告违反斯科特·迈尔斯的《Effective C++》一书中的以下风格准则:
同时警告违反Scott Meyer的“More Effective C++”一书中的以下风格准则:
选择此选项时,请注意标准库头文件并不遵守所有这些准则。
https://stackoverflow.com/questions/14002454
复制相似问题