Quando a sobrecarga é passada por referência (valor-l e valor-r) preferida a passagem por valor?

Eu vi isso dito que umoperator= escrito para obter um parâmetro do mesmo tipo por valor serve como operador de atribuição de cópia e operador de atribuição de movimento em C ++ 11:

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

Onde a alternativa seria mais do que o dobro de linhas com muita repetição de código e potencial para erro:

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

Em que circunstâncias a sobrecarga de ref-para-const e de valor r é preferível para passar por valor, ou quando é necessário? Estou pensando emstd::vector::push_back, por exemplo, que é definido como duas sobrecargas:

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

Seguindo o primeiro exemplo onde passar por valorserve como operador de atribuição de cópia e operador de atribuição de movimentonão podiapush_back ser definido no Padrão para ser uma única função?

void push_back (value_type val);

questionAnswers(1)

yourAnswerToTheQuestion