在 Eckel,第 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)
成功?这里发生了什么???
Q1。当他这样做X(1)
的时候——这里发生了什么?这是一个构造函数调用吗-不应该然后阅读X::X(1);
它是类实例化吗-类实例化不是类似于:X a(1);
编译器如何确定什么
X(1)
是?我的意思是..名称装饰发生所以..X(1)
构造函数调用将转换为:globalScope_X_int
作为函数名称.. ???
Q2。当然,临时对象用于存储X(1)
创建的结果对象,然后将其分配给对象f5()
返回(这也将是一个临时对象)?鉴于f5()
返回一个将很快被丢弃的临时对象,他如何将一个常量临时分配给另一个常量临时?有人可以清楚地解释为什么:
f7(f5());
应该导致一个持续的临时性而不是简单的旧f5();