前/后增量的左值和右值

时间:2017-09-07 22:01:48

标签: c++ rvalue lvalue

学习左值和右值。定义是任何可以是“地址”是左值,否则,它是rvalue。

我检查了运算符优先级,前缀和后缀增量的优先级都高于“地址”运算符。

对于以下两个例子,任何人都可以解释为什么第一个“& ++ value1”是左值,而第二个“& value1 ++”是右值。

我对这两种情况的错误理解是:pValue1指向value1变量。无论在构建地址关联之前或之后将value1更改为8,value1变量总是占用一个内存位置,我们可以派生它的地址,对吗?

int value1=7;

int *pValue1=&++value1;

int *pValue1 = &value1++;

1 个答案:

答案 0 :(得分:11)

根据我的评论,你可以看到编译器反对这种操作的原因。问题在于postfix operator ++的一般实现,后者复制对象(在这种情况下为int),递增原始对象并返回 preincremented copy 。您可以将其视为以下列方式定义的函数:

int foo_operator(int& a)
{
    int copy = a;
    a += 1;
    return copy;
}

如果您尝试在示例中使用该函数,您的编译器也会抗议它。该函数的返回值是 rvalue

您现在可能会问 - 前缀为operator ++的是什么?这不是一个返回值的函数吗?答案是 - 没有。前缀operator ++返回引用,而不是复制值,因此其“结果”可以与操作数&一起使用。