Принять параметр «только для перемещения» по значению или ссылке на значение

Принятый ответ этого постаПередача по значению против передачи по значению rvalue Говорит, что:

Для типов только для перемещения (как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. Я также помню, что читал в книге Скотта Мейерса.Эффективный Современный C ++ об этом, но не могу вспомнить, какой элемент сразу.

Поэтому мой вопрос заключается в том, что для типов «только для перемещения» (или, в более общем случае, когда мы хотим передать владение аргументом), не следует ли нам предпочесть pass-by-rvalue-reference для лучшей производительности?

ОБНОВИТЬ: Я знаю, что конструкторы / операторы присваивания по значению (иногда называемыеобъединительный операторы / операторы присваивания) могут помочь устранить дублирующийся код. Я должен сказать, что меня больше интересует случай, когда (1) важна производительность, и (2) тип не подлежит копированию, поэтому нет дублирующих операторов / операторов присваивания, которые принимаютconst lvalue ссылочные аргументы.

ОБНОВЛЕНИЕ 2: Итак, я нашел блог Скотта Мейерса о конкретной проблеме:http://scottmeyers.blogspot.com/2014/07/should-move-only-types-ever-be-passed.html, Этот блог обсуждает причину, которую он защищает в пункте 41 егоЭффективный Современный C ++ тот:

Рассмотрим передачу по значению только длякопируемые параметры...которыедешево двигаться...[а также]всегда копируется.

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

Ответы на вопрос(2)

Ваш ответ на вопрос