Принятый ответ этого сообщения Передача по значению vs pass by rvalue reference говорит, что:
Для типов только для перемещения (как
std::unique_ptr
) значение прохода по-умолчанию является нормой...
Я немного сомневаюсь в этом. Скажем, существует некотируемый тип Foo
, который также не дешев для перемещения; и некоторый тип Bar
, который имеет член Foo
.
class Foo {
public:
Foo(const Foo&) = delete;
Foo(Foo&&) { /* quite some work */ }
...
};
class Bar {
public:
Bar(Foo f) : f_(std::move(f)) {} // (1)
Bar(Foo&& f) : f_(std::move(f)) {} // (2)
// Assuming only one of (1) and (2) exists at a time
private:
Foo f_;
};
Затем для следующего кода:
Foo f;
...
Bar bar(std::move(f));
Конструктор (1) несет 2 перемещения конструкций, а конструктор (2) только берет на себя 1. Я также помню, как читал в Scott Meyers Effective Modern С++ об этом, но не могу сразу вспомнить, какой элемент.
Итак, мой вопрос заключается в том, что для типов только для перемещения (или, что более важно, когда мы хотим передать право собственности на аргумент), не следует ли нам предпочитать ссылку pass-by-rvalue для лучшей производительности?
ОБНОВЛЕНИЕ:. Я знаю, что конструкторы-получатели/присваивания посылок (иногда называемые унифицированными операторами ctors/assign) могут помочь устранить дублированный код. Я должен сказать, что меня больше интересует случай, когда важна производительность (1), и (2) тип не копируется, и поэтому нет дублирующих операторов ctors/assign, которые принимают const
аргументы ссылки lvalue.
ОБНОВЛЕНИЕ 2: Итак, я нашел блог Скотта Мейерса о конкретной проблеме: http://scottmeyers.blogspot.com/2014/07/should-move-only-types-ever-be-passed.html. В этом блоге обсуждается причина, по которой он защищает в статье 41 своего Эффективного современного С++, что:
Рассмотрим пропуск по значению только для скопируемых параметров... которые дешевы для перемещения... [и] всегда скопированы.
В этом элементе подробно обсуждается вопрос о передаче по значению vs. rvalue, слишком много для цитирования здесь. Дело в том, что оба способа имеют свои преимущества и недостатки, но для передачи права собственности на объект только для перемещения, рекомендуется использовать ссылку rvalue.