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();

Respuestas a la pregunta(4)

Su respuesta a la pregunta