Aceitar parâmetro somente de movimento por referência de valor ou rvalue

A resposta aceita deste postPassagem por valor vs passagem por referência de valor diz que:

Para tipos somente de movimentação (comostd::unique_ptr), a passagem por valor parece ser a norma ...

Estou um pouco em dúvida sobre isso. Digamos que exista algum tipo não copiável,Foo, que também não é barato de se mover; e algum tipoBar que tem um membroFoo.

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_;
};

Em seguida, para o seguinte código:

Foo f;
...
Bar bar(std::move(f));

O construtor (1) incorre em 2 construções de movimento, enquanto o construtor (2) incorre apenas em 1. Lembro-me também de ler o artigo de Scott Meyers.C ++ moderno eficaz sobre isso, mas não consigo lembrar qual item imediatamente.

Portanto, minha pergunta é, para tipos somente de movimentação (ou, geralmente, quando queremos transferir a propriedade do argumento), não devemos preferir a referência de passagem por valor para obter melhor desempenho?

ATUALIZAR: Estou ciente de que os construtores de passagem por valor / operadores de atribuição (às vezes chamadosunificador operadores de atribuição) podem ajudar a eliminar o código duplicado. Devo dizer que estou mais interessado no caso em que (1) o desempenho é importante e (2) o tipo não pode ser copiado e, portanto, não há duplicadores de operadores / operadores de atribuição que aceitemconst argumentos de referência lvalue.

ATUALIZAÇÃO 2: Então, eu encontrei o blog de Scott Meyers sobre o problema específico:http://scottmeyers.blogspot.com/2014/07/should-move-only-types-ever-be-passed.html. Este blog discute o motivo que ele defende no Item 41 de suaC ++ moderno eficaz este:

Considere passar por valor apenas paraparâmetros copiáveis... que sãobarato mudar...[e]sempre copiado.

Há uma extensa discussão nesse item sobre passagem por valor versus referência de valor, muito a ser citado aqui. O ponto é que os dois lados têm suas próprias vantagens e desvantagens, mas, para transferir a propriedade de um objeto somente para movimentação, a referência de passagem por rvalue parece ser preferível.

questionAnswers(2)

yourAnswerToTheQuestion