Temporäre Objekte - wann werden sie erstellt, wie erkennen Sie sie im Code?

In Eckel, Bd. 1, S. 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());
} ///:~

Warum tutf5() = X(1) gelungen? Was geht hier vor sich???

Q1. Wenn er es tutX(1) - Was geht hier vor sich? Handelt es sich um einen Konstruktoraufruf - sollte dieser dann nicht lauten?X::X(1); Ist es eine Klasseninstanziierung - ist es nicht eine Klasseninstanziierung wie:X a(1); Wie bestimmt der Compiler wasX(1) ist ?? Ich meine .. Namensdekoration findet so statt ..X(1) Der Konstruktoraufruf würde folgendermaßen übersetzt:globalScope_X_int als Funktionsname .. ???

Q2. Sicherlich wird ein temporäres Objekt verwendet, um das resultierende Objekt zu speichernX(1) erstellt und dann wäre das dann nicht dem objekt zugeordnetf5() gibt zurück (was wäre auch ein temporäres Objekt)? Angesichts dessenf5() Gibt ein temporäres Objekt zurück, das bald verworfen wird. Wie kann er eine Konstante temporär einer anderen Konstante temporär zuweisen? Könnte jemand klar erklären, warum:f7(f5()); sollte in einer konstanten temporären und nicht schlicht alten führenf5();

Antworten auf die Frage(4)

Ihre Antwort auf die Frage