Objetos temporales: cuando se crean, ¿cómo los reconoces en el código?
En Eckel, Vol. 1, pág. 367.
//: C08:ConstReturnValues.cpp
// Constant return by value
// Result cannot be used as an lvalue
class X {
int i;
public:
X(int ii = 0);
void modify();
};
X::X(int ii) { i = ii; }
void X::modify() { i++; }
X f5() {
return X();
}
const X f6() {
return X();
}
void f7(X& x) { // Pass by non-const reference
x.modify();
}
int main() {
f5() = X(1); // OK -- non-const return value
f5().modify(); // OK
// Causes compile-time errors:
//! f7(f5());
//! f6() = X(1);
//! f6().modify();
//! f7(f6());
} ///:~
Por quef5() = X(1)
tenido éxito? ¿¿¿Que esta pasando aqui???
Q1. Cuando lo haceX(1)
- ¿que esta pasando aqui? ¿Es esta una llamada del constructor? ¿No debería leer esto?X::X(1);
Es una instanciación de clase, no es una creación de clase algo así como:X a(1);
¿Cómo determina el compilador qué?X(1)
¿¿es?? Quiero decir .. la decoración del nombre tiene lugar así que ..X(1)
La llamada del constructor se traduciría en algo como:globalScope_X_int
como el nombre de la función .. ???
Q2. Seguramente se utiliza un objeto temporal para almacenar el objeto resultante queX(1)
crea y luego sería asignado al objetof5()
devuelve (que también sería un objeto temporal)? Dado quef5()
devuelve un objeto temporal que pronto se descartará, ¿cómo puede asignar una constante temporal a otra constante temporal? ¿Podría alguien explicar claramente por qué?f7(f5());
Debería volver a aparecer en un tiempo temporal constante y no simple.f5();