Конструктор перемещения: как обрабатывать атрибут контейнера?

Как правильно инициализировать атрибут контейнера, избегая реконструкции содержащихся объектов?

class BAR
{
...
};

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

  std::vector<BAR> b;
};

3 ответа

Решение

Если у вас нет веской причины поступать иначе, просто следуйте правилу нуля и избегайте явного определения конструктора перемещения: компилятор сгенерирует его для вас неявно, и этот конструктор перемещения выполнит перемещение элементов данных класса по элементам.

Если вам действительно нужно явно определить конструктор перемещения (например, потому что вы используете MSVC, и по какой-то непонятной причине MSVC никогда не будет генерировать для вас конструктор перемещения неявно), сделайте это следующим образом:

Foo(Foo&& f) : b(std::move(f.b)) { /* ... */ }

Смотрите ответ Энди, но если вам нужно:

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

  }

  std::vector<BAR> b;
};

Это было бы

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

Но это не обязательно, как уже отмечали другие, это неявный конструктор перемещения, который будет генерироваться для вас.

Другие вопросы по тегам