¿Debo devolver una referencia de valor (por std :: move'ing)?

A C ++ Siguiente entrada de blog dijo eso

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

SiA tiene un constructor accesible para copiar o mover, el compilador puede optar por ignorar la copia. De lo contrario, siA tiene un constructor de movimiento,v se mueve De lo contrario, siA tiene un copia constructor,v se copia De lo contrario, se emite un error de tiempo de compilación.

Pensé que siempre debería devolver el valor sinstd::move porque el compilador podría descubrir la mejor opción para los usuarios. Pero en otro ejemplo de la entrada del blog.

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

Aquí elstd::move es necesario porquey debe ser tratado como un valor dentro de la función.

Ah, mi cabeza casi explota después de estudiar esta publicación de blog. Hice lo mejor que pude para entender el razonamiento, pero cuanto más estudiaba, más confundido estaba. ¿Por qué deberíamos devolver el valor con la ayuda destd::move?