¿Los compiladores de C ++ 11 convierten las variables locales en valores cuando pueden durante la optimización del código?

A veces es aconsejable dividir expresiones complicadas o largas en varios pasos, por ejemplo (la segunda versión no es más clara, pero es solo un ejemplo):

return object1(object2(object3(x)));

Se puede escribir como:

object3 a(x);
object2 b(a);
object1 c(b);
return c;

Suponiendo que las 3 clases implementan constructores que toman rvalue como parámetro, la primera versión podría ser más rápida, porque los objetos temporales se pasan y se pueden mover. Supongo que en la segunda versión, las variables locales se consideran valores. Pero si las variables no se usan más tarde, ¿los compiladores de C ++ 11 optimizan el código para que las variables se consideren valores y ambas versiones funcionen exactamente igual? Estoy principalmente interesado en el compilador C ++ de Visual Studio 2013, pero también estoy feliz de saber cómo se comporta el compilador GCC en este asunto.

Gracias Michal

Respuestas a la pregunta(4)

Su respuesta a la pregunta