Si tengo una clase A (que devuelve un objeto por valor), y dos funciones f() y g() que tiene una diferencia en tan sólo sus variables de retorno:¿Cómo realmente devuelve una función por valor?
class A
{
public:
A() { cout<<"constructor, "; }
A (const A&) { cout<<"copy-constructor, "; }
A& operator = (const A&) { cout<<"assignment, "; }
~A() { cout<<"destructor, "; }
};
const A f(A x)
{A y; cout<<"f, "; return y;}
const A g(A x)
{A y; cout<<"g, "; return x;}
main()
{
A a;
A b = f(a);
A c = g(a);
}
Ahora cuando ejecuto la línea de A b = f(a);
, Emite:
copy-constructor, constructor, f, destructor
, lo que está bien suponiendo que el objeto y en f() se crea directamente en el destino, es decir, en la ubicación de memoria del objeto b, y no hay temporales involucrados.
Mientras que cuando ejecuto la línea A c = g(a);
, se da salida:
copy-constructor, constructor, g, copy-constructor, destructor, destructor,
.
Entonces, la pregunta es por qué en el caso de g() no se puede crear el objeto directamente en la ubicación de la memoria de c, tal como sucedió al llamar a f()? ¿Por qué llama a un copiador-constructor adicional (que presumo es debido a la participación temporal) en el segundo caso?
Si desea que el compilador realice optimizaciones, deberá compilar con las optimizaciones habilitadas. –
No creo que tenga nada que ver con las optimizaciones del compilador, como ya lo he intentado. – cirronimbo