В 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();