O compilador pode gerar std :: move para um último uso de lvalue automaticamente?

Um código como este é frequentemente visto em artigos de referências de valor r:

Dave Abrams: mova-o com referências de valor

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
}

Poderia um compilador gerar essa otimização automaticamente, isto é, detectar um valor l será destruído de qualquer maneira e poderia ser movido de, ou isso seria uma violação do padrão, assumindo um caso genérico que o compilador não sabe sobre como é mover, copiar ou destruir implementado para a classe X?

Se tal otimização é permitida, ela é executada por algum compilador na prática?