Конструктор перемещения: как обрабатывать атрибут контейнера?
Как правильно инициализировать атрибут контейнера, избегая реконструкции содержащихся объектов?
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))
{
}
Но это не обязательно, как уже отмечали другие, это неявный конструктор перемещения, который будет генерироваться для вас.