Devo devolver uma referência de valor (por std :: move'ing)?

A C ++ Next post no blog disse isso

A compute(…)
{
    A v;
    …
    return v;
}

E seA tem um construtor de copiar ou mover acessível, o compilador pode optar por elidir a cópia. Caso contrário, seA tem um construtor de movimento,v é movido. Caso contrário, seA tem um construtor de cópia,v é copiado. Caso contrário, um erro de tempo de compilação é emitido.

Eu pensei que deveria sempre devolver o valor semstd::move porque o compilador seria capaz de descobrir a melhor escolha para os usuários. Mas em outro exemplo da postagem do blog

Matrix operator+(Matrix&& temp, Matrix&& y)
  { temp += y; return std::move(temp); }

Aqui ostd::move é necessário porquey deve ser tratado como um lvalue dentro da função.

Ah, minha cabeça quase explode depois de estudar este post no blog. Eu tentei o meu melhor para entender o raciocínio, mas quanto mais eu estudava, mais confuso ficava. Por que devemos devolver o valor com a ajuda destd::move?

questionAnswers(4)

yourAnswerToTheQuestion