У Эккеля, т. 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();