2

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

class BAR
{
...
};

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

  std::vector<BAR> b;
};
4

3 回答 3

8

除非您有充分的理由这样做,否则只需遵循零规则并避免显式定义移动构造函数:编译器将为您隐式生成一个,并且该移动构造函数将执行类数据成员的成员移动。

如果您确实必须显式定义移动构造函数(例如,因为您使用的是 MSVC,并且出于某种模糊的原因,MSVC永远不会为您隐式生成移动构造函数),请这样做:

Foo(Foo&& f) : b(std::move(f.b)) { /* ... */ }
于 2013-05-20T12:14:51.143 回答
2

请参阅安迪的回答,但如果您需要:

class FOO
{
public:
  FOO(FOO &&f) : b(std::move(f.b))
  {

  }

  std::vector<BAR> b;
};
于 2013-05-20T12:15:41.607 回答
1

这将是

FOO(FOO &&f): b(std::move(f.b))
{
}

但这不是必需的,正如其他人所指出的那样,它是隐式移动构造函数将为您生成。

于 2013-05-20T12:16:18.500 回答