Wann ist die Überlastung der Referenzübergabe (l-Wert und r-Wert) der Wertübergabe vorzuziehen?

Ich habe gesehen, dass aoperator= In C ++ 11 wird der Zuweisungsoperator für das Kopieren und das Verschieben von Parametern verwendet, die so geschrieben wurden, dass sie einen Wert vom selben Typ annehmen:

Foo& operator=(Foo f)
{
    swap(f);
    return *this;
}

Wo die Alternative mehr als doppelt so viele Zeilen mit viel Code-Wiederholung und Fehlerpotential wäre:

Foo& operator=(const Foo& f)
{
    Foo f2(f);
    swap(f2);
    return *this;
}

Foo& operator=(Foo&& f)
{
    Foo f2(std::move(f));
    swap(f2);
    return *this;
}

Unter welchen Umständen ist es vorzuziehen, die Überladung von ref-to-const und r-value als Wert zu übergeben, oder wann ist dies erforderlich? Ich denke überstd::vector::push_backDies ist beispielsweise definiert als zwei Überladungen:

void push_back (const value_type& val);
void push_back (value_type&& val);

Nach dem ersten Beispiel wurde der Wert übergebenDient als Kopierzuweisungsoperator und Verschiebungszuweisungsoperatorkonnte nichtpush_back im Standard als Einzelfunktion definiert werden?

void push_back (value_type val);

Antworten auf die Frage(1)

Ihre Antwort auf die Frage