move构造函数:如何处理容器属性?

时间:2013-05-20 12:11:54

标签: c++ c++11 move-semantics

如何正确初始化容器属性,避免重构包含的对象?

class BAR
{
...
};

class FOO
{
  public:
  FOO(FOO &&f)
  {
    // ????
  }

  std::vector<BAR> b;
};

3 个答案:

答案 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))
{
}

但正如其他人所指出的那样,没有必要,这是隐式移动构造函数会为你生成的。