Aceptar parámetros de solo movimiento por valor o referencia de valor

La respuesta aceptada de esta publicaciónPasar por valor vs pasar por rvalue reference dice que:

Para tipos de solo movimiento (comostd::unique_ptr), el paso por valor parece ser la norma ...

Tengo un poco de dudas al respecto. Digamos que hay algún tipo no copiable,Foo, que tampoco es barato moverse; y algún tipoBar que tiene un miembroFoo.

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

Luego para el siguiente código:

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

El constructor (1) incurre en 2 construcciones de movimiento, mientras que el constructor (2) solo incurre en 1. También recuerdo haber leído en Scott MeyersEfectivo moderno C ++ sobre esto, pero no puedo recordar qué elemento de inmediato.

Entonces, mi pregunta es, para los tipos de solo movimiento (o, más en general, cuando queremos transferir la propiedad del argumento), ¿no deberíamos preferir pasar por referencia de valor para un mejor rendimiento?

ACTUALIZAR: Soy consciente de que los constructores de paso por valor / operadores de asignación (a veces llamadosunificador ctors / operadores de asignación) pueden ayudar a eliminar el código duplicado. Debo decir que estoy más interesado en el caso cuando (1) el rendimiento es importante, y (2) el tipo no se puede copiar y, por lo tanto, no hay operadores duplicados / operadores de asignación que aceptenconst Valore los argumentos de referencia.

ACTUALIZACIÓN 2: Entonces encontré el blog de Scott Meyers sobre el problema específico:http://scottmeyers.blogspot.com/2014/07/should-move-only-types-ever-be-passed.html. Este blog discute la razón por la que aboga en el Artículo 41 de suEfectivo moderno C ++ ese:

Considere pasar por valor solo paraparámetros copiables...que sonbarato moverse...[y]siempre copiado.

Hay una discusión extensa en ese ítem sobre la referencia de pasar por valor versus rvalue, demasiado para ser citado aquí. El punto es que ambas formas tienen sus propias ventajas y desventajas, pero para transferir la propiedad de un objeto de solo movimiento, parece preferible pasar por referencia de valor.

Respuestas a la pregunta(2)

Su respuesta a la pregunta