В 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());
} ///:~
Почему выполняется f5() = X(1)? Что здесь происходит?
Q1. Когда он делает X(1) - что здесь происходит? Это вызов конструктора -
не следует ли это читать X::X(1); Является ли это экземпляром класса - не является классом
что-то вроде: X a(1); Как компилятор определяет, что
X(1) есть? Я имею в виду.. оформление названия происходит так. X(1) конструктор
вызов будет переводить на что-то вроде: globalScope_X_int в качестве функции
имя..???
Q2. Разумеется, временный объект используется для хранения результирующего объекта, который X(1)
создает, а затем будет присваиваться этому объекту f5()
(который также будет временным объектом)? Учитывая, что f5() возвращает временную
объект, который скоро будет отброшен, как он может назначить одну постоянную временную
к другому постоянному временному??? Может ли кто-нибудь объяснить, почему:
f7(f5()); должен повторить постоянный временный и не простой старый f5();