Kiedy przeładowanie przechodzi przez referencję (wartość-l i wartość-r) preferowane przez przekazywanie wartości?

Widziałem, że to powiedziałoperator= napisane w celu pobrania parametru tego samego typu wg wartości służy zarówno jako operator przypisania kopiowania, jak i operator przypisania przeniesienia w C ++ 11:

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

Tam, gdzie alternatywą byłoby więcej niż dwa razy więcej wierszy z dużą ilością powtórzeń kodu i potencjalnym błędem:

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

W jakich okolicznościach przeciążenie ref-to-const i r-value jest preferowane, aby przejść przez wartość lub kiedy jest to konieczne? Myślę ostd::vector::push_back, na przykład, który jest zdefiniowany jako dwa przeciążenia:

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

Podążając za pierwszym przykładem, w którym przekazujesz wartośćsłuży jako operator przypisania kopii i operator przypisania przeniesienia, nie mogłempush_back być zdefiniowane w standardzie jako jedna funkcja?

void push_back (value_type val);

questionAnswers(1)

yourAnswerToTheQuestion