【发布时间】:2013-08-20 18:05:00
【问题描述】:
临时对象的生命周期持续到使用without references时创建它的表达式的完整长度。
考虑以下几点:
class My
{
int i;
public:
void increment()
{
i++;
}
};
My withOutConst()
{
return My();
}
const My withConst()
{
return My();
}
int main()
{
My ob;
withOutConst().increment(); // Case 1
withConst().increment(); // Case 2
return 0;
}
据我了解,编译器会创建一个 temporary 对象(const My 类型)来保存上述情况下的返回值。
而且,我正在尝试修改临时对象。
(1)编译正常
(2) 导致编译时错误,错误为:
error: passing 'const My' as 'this' argument of void My::increment() discards qualifiers
这意味着基本上this 是My 类型,而不是const My,因为它是为non-const 函数调用的。
我的问题:
我正在尝试通过调用non-const 成员函数来修改const My 类型的临时对象。
那么为什么我在 case(1) 中没有得到相同的错误,因为在这两种情况下我都在对 const My 类型的对象进行操作。
我知道这与函数的return type 有关,但我无法完全理解,因为最后它归结为函数(void My::increment()),它试图修改const My 类型的临时变量两种情况。
【问题讨论】:
-
很久没用C++做点什么了,
My ob;有什么作用呢? -
在情况 1 中,您的临时地址不是
const。所以你可以在它上面调用非常量方法。案例 2 中的情况并非如此。 -
这里要记住的重要一点是,您创建了两个函数,它们基本上分别创建对象
My x和const My y。所以,真的,你的My ob没有实际用途。很可能编译器只是将其优化为我上面提到的内容。
标签: c++ temporary-objects