Objetos temporários - quando eles são criados, como você os reconhece no código?

Em Eckel, Vol. 1, pg: 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());
} ///:~

Porquef5() = X(1) succed? O que está acontecendo aqui???

Q1 Quando ele fazX(1) - o que está acontecendo aqui? Isso é uma chamada de construtor - isso não deveria lerX::X(1); É instanciação de classe - a instanciação de classes não é algo como:X a(1); Como o compilador determina o queX(1) é?? Quer dizer .. decoração do nome acontece então ..X(1) a chamada do construtor se traduziria para algo como:globalScope_X_int como o nome da função .. ???

Q2 Certamente, um objeto temporário é usado para armazenar o objeto resultante queX(1) cria e então não seria então atribuído ao objetof5() retorna (que também seria um objeto temporário)? Dado quef5() retorna um objeto temporário que será descartado em breve, como ele pode atribuir uma constante temporária a outra constante temporária ??? Alguém poderia explicar claramente porque:f7(f5()); deve reultuar em uma constante temporária e não simplesf5();

questionAnswers(4)

yourAnswerToTheQuestion