如何正确初始化容器属性,避免重构包含的对象?
class BAR
{
...
};
class FOO
{
public:
FOO(FOO &&f)
{
// ????
}
std::vector<BAR> b;
};
答案 0 :(得分:8)
除非你有充分的理由不这样做,只需follow the Rule of Zero并避免明确定义移动构造函数:编译器会隐式生成一个,并且移动构造函数将执行类的成员移动数据成员。
如果你真的必须明确地定义一个移动构造函数(例如,因为你正在使用MSVC,并且由于某些模糊的原因,MSVC将从不隐式地为你生成移动构造函数),请这样做:
Foo(Foo&& f) : b(std::move(f.b)) { /* ... */ }
答案 1 :(得分:2)
请参阅Andy的回答,但如果您需要:
class FOO
{
public:
FOO(FOO &&f) : b(std::move(f.b))
{
}
std::vector<BAR> b;
};
答案 2 :(得分:1)
这将是
FOO(FOO &&f): b(std::move(f.b))
{
}
但正如其他人所指出的那样,没有必要,这是隐式移动构造函数会为你生成的。