【发布时间】:2016-03-21 03:30:43
【问题描述】:
前缀运算符返回对象 本身作为左值。后缀运算符返回对象原始值的副本 作为右值。
所以在*a++ 这样的语句中,a 正在递增,并且 a 的原始值的副本作为右值返回,但来自 microsoft c++ 语言对左值和右值的参考
右值是一个临时值,不会在使用它的表达式之外持续存在
并举个例子
// lvalues_and_rvalues1.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main()
{
int x = 3 + 4;
cout << x << endl;
}
在这个例子中,x 是一个左值,因为它在定义它的表达式之外仍然存在。表达式 3 + 4 是一个右值,因为它的计算结果是一个临时值,该值不会持续超出定义它的表达式。
我的问题:
1) 从*a++ 返回的右值是什么,以便可以取消引用?
2)我误解了任何概念吗?
提前致谢!
【问题讨论】:
-
你的第一句话是假的,例如
+x是一个右值。也许它只是在谈论++和--运算符。 -
第二个引用也是错误的:rvalue是一个表达式类别,不是一个值。 (命名有点混乱)。
3 + 4是一个右值,但第三个引号应该说“它不会在表达式之外持续存在,因为它是一个临时值”,而不是相反。 -
我的意思是这句话实际上是不正确的——没有指责你抄写错误或任何事情
-
Here 是一个描述 rvalue 含义的页面。如果您尝试从该 MSDN 页面学习,您会感到困惑,这不足为奇
-
@psraganvesh 是的,这是一种表达方式。但请记住,对于类类型的右值(即指定临时对象的右值),您可以获得一个标识该临时对象位置的左值。 (例如,如果对象具有通过引用执行
return *this;的成员函数)。右值是表达式的属性,而不是对象的属性。如果您指的是临时对象,请说“临时对象”。
标签: c++ dereference lvalue rvalue