Временные объекты - когда они создаются, как вы узнаете их в коде?
В Экель, том 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();