Obiekty tymczasowe - kiedy są tworzone, jak je rozpoznać w kodzie?

W Eckel, tom 1, str: 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());
} ///:~

Dlaczegof5() = X(1) sukcesem? Co tu się dzieje???

Q1. Kiedy to robiX(1) - co tu się dzieje? Czy jest to wywołanie konstruktora - nie powinno to być wtedy czytaneX::X(1); Czy jest to instancja klasy - czy instancja klasy nie wygląda tak:X a(1); W jaki sposób kompilator określa, coX(1) jest?? Chodzi mi o to, że dekoracja imion ma miejsce ..X(1) wywołanie konstruktora przełoży się na coś takiego:globalScope_X_int jako nazwa funkcji .. ???

Q2. Z pewnością tymczasowy obiekt jest używany do przechowywania wynikowego obiektuX(1) tworzy, a następnie nie byłby przypisywany do obiektuf5() zwraca (który byłby również obiektem tymczasowym)? Jeśli się uwzględnif5() zwraca tymczasowy obiekt, który wkrótce zostanie odrzucony, jak może przypisać jedną stałą tymczasową do innej stałej tymczasowej ?? Czy ktoś mógłby wyjaśnić wyraźnie, dlaczego:f7(f5()); powinien mieć stałą, tymczasową i nie zwykłą starośćf5();

questionAnswers(4)

yourAnswerToTheQuestion