¿Cómo sabe el compilador para mover variables locales?

Tengo curiosidad por saber exactamente cómo funciona esta característica. Considerar algo como

std::unique_ptr<int> f() { std::unique_ptr<int> lval(nullptr); return lval; }

Este código compila bien incluso para un tipo de solo movimiento, ya que el compilador lo mueve implícitamente. Pero lógicamente, para cualquier expresión de retorno, determinar si el resultado se refiere o no a una variable local estaría resolviendo el problema de detención, y si el compilador simplemente tratara todas las variables locales como rvalores en la expresión de retorno, entonces esto sería problemático como la variable puede ser referido en esa expresión varias veces. Incluso si un local solo tuviera unodirecto de referencia, no podría probar que no tenía otros alias indirectos.

Entonces, ¿cómo sabe el compilador cuándo moverse de la expresión de retorno?

Respuestas a la pregunta(4)

Su respuesta a la pregunta