编译以下代码时:
foo.h中:
#include <memory>
#include <vector>
struct external_class;
struct A {
struct B {
std::vector<external_class> bad_vector;
};
std::vector<external_class> good_vector;
std::shared_ptr<B> b;
A();
};
Foo.cpp中:
#include "foo.h":
struct external_class {}; // implement external_class
A::A() :
good_vector(), // <- easy to initialize via default constructor
b(std::make_shared<B>()) // <- does not involve bad_vector::ctor -> warning
{ }
int main() { A a; }
..使用-Weffc++
标志(gcc)我收到警告
foo.cpp:9:12: warning: ‘A::B::bad_vector’ should be initialized in the member initialization list [-Weffc++]
struct B {
^
我完全清楚这一点,但我想知道如何摆脱它。
出于依赖性原因,我需要external_class
的前向声明,因此无法进行类内初始化。我可以为A::B
提供构造函数并在foo.cpp
中实现它,但我仍然希望通过为A::b
提供初始化程序来初始化A::B::bad_vector
的方法很短(类似于A::good_vector
)。
是吗?什么是语法(我应该用Google搜索来找到解决方案?)或者我是否必须为B
提供构造函数?
答案 0 :(得分:5)
你的代码很好。
警告基本上是B
没有明确默认初始化bad_vector
的构造函数。但B
的默认构造函数已默认初始化bad_vector
。即使B() = default;
没有使警告静音,您实际上也必须写出B() : bad_vector() { }
。那对我来说,-Weffc++
可能在C ++ 11中已经过时了。