¿Puede el compilador generar std :: move para un último uso de lvalue automáticamente?

Un código como este se ve a menudo en los artículos de referencias de valor r:

Dave Abrams: Move It With Rvalue References

void g(X);

void f()
{
    X b;
    g(b);              // still need the value of b
    …
    g( std::move(b) ); // all done with b now; grant permission to move
}

¿Podría un compilador generar esta optimización automáticamente, es decir, detectar un valor l se va a destruir de todos modos y podría ser movido, o sería una violación de la norma, suponiendo un caso genérico del cual el compilador no sabe nada de cómo está? ¿Mover, copiar o destruir implementado para la clase X?

Si se permite dicha optimización, ¿la realiza algún compilador en la práctica?

Respuestas a la pregunta(3)

Su respuesta a la pregunta