Временные объекты - когда они создаются, как вы узнаете их в коде?

В Экель, том 1, стр. 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());
} ///:~

Почемуf5() = X(1) succed? Что здесь происходит???

Q1. Когда он делаетX(1) - что происходит здесь? Это вызов конструктора - не должен это читатьX::X(1); Реализация класса - это не класс? создание экземпляра что-то вроде:X a(1); Как компилятор определяет, что X(1) является?? Я имею в виду .. название украшения происходит так ..X(1) конструктор вызов будет переводить что-то вроде:globalScope_X_int как функция название.. ???

Q2. Конечно, временный объект используется для хранения результирующего объекта, которыйX(1) создает и затем будет назначен объектуf5() возвращается (который также будет временным объектом)? При условииf5() возвращает временный объект, который вскоре будет отброшен, как он может назначить одну постоянную временную к другому постоянному временному ??? Может ли кто-нибудь объяснить, почему: f7(f5()); должен приводить к постоянному временному, а не старомуf5();

Ответы на вопрос(4)

Ваш ответ на вопрос