C — Переместить конструктор для класса, содержащего строки

#c

#c

Вопрос:

 class Foo { int a; int b; int c; std::wstring d; std::vector<char*> e };
  

Предполагая большую строку (~ 512 байт) и ~ 512 байт для std::vector и это вариант использования следующим образом:

 void Test()
{
    Foo foo;
    DoSomething(std::move(foo)); // DoSomething will stuff it in a long-lived queue
}
  

По сути, я хочу, чтобы время жизни объекта RAII изменилось.

Это когда я реализую конструктор перемещения и оператор присваивания? Или просто делать std::move(..) достаточно хорошо?

Комментарии:

1. Ваш вектор на самом деле не содержит строк, в большинстве случаев указатели на строки. Копирование Foo /вектор в любом случае не будет копировать строки.

2. Как только вы начнете играть с указателями, предположите, что действуют Правила Трех и Пяти

Ответ №1:

std::move бесполезен без конструктора перемещения и / или оператора присваивания перемещения.

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

Итак, в данном конкретном случае ответ заключается в том, что вам не нужно определять конструктор перемещения или оператор присваивания.