C ++ переместить конструкторы без rvalue ссылок? - PullRequest
0 голосов
/ 04 октября 2019

Я только что нашел некоторый код в Boost, перефразированный следующим образом:

class A {};

class B {
public:
  B(A a): a_(std::move(a)) {}
private:
  A a_;
};

int main() {
  A a;
  B b(std::move(a));
}

Предполагая, что это работает, зачем использовать конструктор перемещения / присваивание со ссылкой на rvalue? Или конструктор / назначение перемещения просто избавят вас от необходимости второго std::move() вызова?

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Мой «перефразированный» код на самом деле происходит из кода, на который ссылается этот вопрос, поэтому мой вопрос уже был задан и получен ответ.

0 голосов
/ 04 октября 2019

C ++ конструкторы перемещения без rvalue-ссылок?

B(A) не является конструктором перемещения. Это конвертирующий конструктор.

Предполагается, что это работает

Этот конвертирующий конструктор работает.

зачем использовать перемещение конструктора / присваивания сСсылка на rvalue?

Поскольку вы не можете иметь конструктор / назначение перемещения без ссылки на rvalue.

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

...