前/后缀增量的左值和右值
学习左值和右值。 定义是什么可以是“地址”是左值,否则,它是右值。
我检查了运算符优先级,前缀和后缀增量比“运算符的地址”具有更高的优先级。
对于以下两个例子,任何人都可以解释一下为什么第一个“&++ value1”是一个左值,而第二个“&value1 ++”是右值。
对这两种情况我的错误理解是:pValue1指向value1变量。 在建立地址关联之前或之后,无论value1变为8,value1变量总是占用一个内存位置,我们可以得到它的地址,对吗?
int value1=7;
int *pValue1=&++value1;
int *pValue1 = &value1++;
根据我的评论,你可以看到编译器为什么会反对这种操作。 问题在于postfix operator ++
一般实现,它复制对象(在这种情况下为int
),递增原始对象并返回该预先指定的副本 。 你可以把它想象成一个按以下方式定义的函数:
int foo_operator(int& a)
{
int copy = a;
a += 1;
return copy;
}
如果你尝试在你的例子中使用这个函数,你的编译器也会抗议它。 该函数的返回值是一个右值 。
你现在可能会问 - 前缀operator ++
什么用? 那也不是一个返回值的函数吗? 答案是 - 不 。 前缀operator ++
返回一个引用 ,而不是一个复制的值,因此它的'结果'可以和操作数&
一起使用。
上一篇: lvalue and rvalue for pre/postfix increment
下一篇: Can't make a function accept both rvalue and lvalue references