Nur Verschiebeparameter nach Wert oder Referenzwert akzeptieren

Die akzeptierte Antwort auf diesen BeitragPass by value vs rvalue reference @ übergeb sagt, dass

Für Nur-Verschieben-Typen (alsstd::unique_ptr), Pass-by-Value scheint die Norm zu sein ...

Ich bin ein bisschen skeptisch. Angenommen, es gibt einen nicht kopierbaren Typ,Foo, was auch nicht billig zu bewegen ist; und ein TypBar das hat ein MitgliedFoo.

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

Dann für den folgenden Code:

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

Constructor (1) verursacht 2 Bewegungskonstruktionen, während Constructor (2) nur 1 verursacht. Ich erinnere mich auch, in Scott Meyers's @ gelesen zu habeEffective Modern C ++ darüber, kann mich aber nicht sofort an den Artikel erinnern.

So ist meine Frage, für Nur-Verschieben-Typen (oder allgemeiner, wenn wir den Besitz des Arguments übertragen möchten), sollten wir es nicht vorziehen, eine rWert-Referenz zu übergeben, um eine bessere Leistung zu erzielen?

AKTUALISIEREN Mir ist bekannt, dass die Konstruktoren / Zuweisungsoperatoren für die Übergabe von Werten (manchmal als @ bezeichnevereinigen ctors / Zuweisungsoperatoren) können dazu beitragen, doppelten Code zu vermeiden. Ich sollte sagen, dass mich der Fall mehr interessiert, wenn (1) die Leistung wichtig ist und (2) der Typ nicht kopierbar ist und es daher keine doppelten ctors / Zuweisungsoperatoren gibt, die @ akzeptiereconst lWertbezugsargumente.

UPDATE 2: Also habe ich Scott Meyers Blog über das spezifische Problem gefunden:http: //scottmeyers.blogspot.com/2014/07/should-move-only-types-ever-be-passed.htm. Dieser Blog beschreibt den Grund, den er in Punkt 41 seines @ befürworteEffective Modern C ++ Das

Consider nur für @ als Wert übergebcopyable parameters...das sindbillig bewegen...[und] immer kopiert.

Dieser Punkt enthält eine ausführliche Diskussion über die Referenz zwischen Übergabe nach Wert und Wert, zu viel, um hier zitiert zu werden. Der Punkt ist, beide Wege haben ihre eigenen Vor- und Nachteile, aber für die Übertragung des Eigentums an einem reinen Verschiebungsobjekt scheint die Übergabe einer Wertreferenz vorzuziehe

Antworten auf die Frage(4)

Ihre Antwort auf die Frage