Когда перегрузка проход по ссылке (l-значение и r-значение) предпочтительнее передачи по значению?

Я видел, что сказано, чтоoperator= записанный для получения параметра одного и того же типа по значению служит как оператором копирования, так и оператором перемещения в C ++ 11:

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

Где альтернатива будет более чем в два раза больше строк с большим количеством повторений кода и возможностью ошибки:

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

При каких обстоятельствах предпочтительнее перегрузку ref-to-const и r-value передавать по значению или когда это необходимо? Я думаю оstd::vector::push_backНапример, который определяется как две перегрузки:

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

Следуя первому примеру, где передать по значениюслужит оператором копирования и оператором перемещенияне могpush_back определиться в Стандарте как отдельная функция?

void push_back (value_type val);

Ответы на вопрос(1)

Ваш ответ на вопрос