¿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?