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.