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

У Эккеля, т. 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)удалось? Что здесь происходит???

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

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

33
задан Guy Avraham 23 March 2018 в 15:06
поделиться