在Eckel的第一卷,第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();