Принять параметр «только для перемещения» по значению или ссылке на значение
Принятый ответ этого постаПередача по значению против передачи по значению 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 представляется предпочтительной.