【发布时间】:2012-06-09 11:59:43
【问题描述】:
在 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) 成功了?这是怎么回事???
第一季度。当他这样做时X(1) - 这里发生了什么?这是一个构造函数调用 -
这不应该然后阅读X::X(1); 是类实例化 - 不是类
实例化类似:X a(1); 编译器如何确定什么
X(1) 是??我的意思是.. 名称装饰发生所以.. X(1) 构造函数
call 将转换为:globalScope_X_int 作为函数
名字..???
第二季度。肯定会使用一个临时对象来存储X(1) 的结果对象
创建然后将其分配给对象 f5() 返回
(这也将是一个临时对象)?鉴于 f5() 返回一个临时的
即将被丢弃的对象,他如何分配一个常量临时
到另一个常数临时???有人可以清楚地解释为什么:
f7(f5()); 应该是一个恒定的临时而不是简单的旧 f5();
【问题讨论】:
-
X::X 指的是构造函数。这在表达式中是不允许的,而仅在某些形式的声明中是不允许的。构造函数总是被隐式调用。
标签: c++ temporary-objects