c++ - ¿El objeto devuelto desde una función aún se crea cuando no se usa?
lifetime (2)
Siento que hay un malentendido cuando se trata de RVO y copia elision. No significa que el valor de retorno de una función no se haya creado. Siempre se crea, eso no es algo que una implementación pueda superar.
El único margen de maniobra, cuando se trata de ocultar copias, a pesar de los efectos secundarios, es cortar al intermediario. Cuando inicializa un objeto con el resultado de la llamada, el estándar permite conectar el objeto de destino para que la función se inicie directamente.
Si no proporciona un objeto de destino (utilizando el resultado), se debe materializar un temporal y destruirlo, como parte de la expresión completa que contiene la llamada a la función.
Así que para jugar un poco con tu ejemplo:
doStuff(); // An object is created and destroyed as part of temporary materialization
// Depending on the compilers analysis under the as-if rule, there may be
// further optimization which gets rid of it all. But there is an object there
// formally.
std::rand() && (doStuff(), std::rand());
// Depending on the result of std::rand(), this may or may not create an object.
// If the left sub-expression evaluates to a falsy value, no result object is materialized.
// Otherwise, one is materialized before the second call to std::rand() and
// destroyed after it.
Considere el siguiente código. ¿Qué sucede cuando se llama a doStuff () pero no se usa el valor de retorno? ¿Aún se crea SomeClass? Por supuesto, la creación en sí misma puede tener efectos secundarios importantes, pero también lo pueden hacer los constructores de copias y aún se omiten en RVO / copy-elision.
SomeClass doStuff(){
//...do stuff
return SomeClass( /**/);
}
SomeClass some_object = doStuff();
doStuff(); //What happens here?
(Editar: probé esto con GCC-O3. El objeto se construye y luego se destruye de inmediato)
Un compilador puede ocultar una copia innecesaria en ciertos casos, incluso si tiene efectos secundarios, sí.
Un compilador no puede ocultar la existencia completa de un objeto, si tiene efectos secundarios.
Si no tiene efectos secundarios, no se puede observar ningún resultado, por lo que si la existencia sucedió o no es, efectivamente, no es una cuestión.
tl; dr: el estándar enumera oportunidades de elección muy específicas, y esta no es una de ellas.