pre/postfix 增量的左值和右值

lvalue and rvalue for pre/postfix increment

学习左值和右值。定义是任何可以是 "address of" 的是左值,否则是右值。

我检查了运算符的优先级,前缀和后缀增量都比 "address of" 运算符具有更高的优先级。

对于下面的两个例子,谁能解释一下为什么第一个“&++value1”是左值而第二个“&value1++”是右值。

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

int value1=7;

int *pValue1=&++value1;

int *pValue1 = &value1++;

根据我的评论,您可以了解为什么编译器反对这种操作。问题在于后缀 operator ++ 的一般实现,它复制对象(在本例中为 int),增加原始对象和 returns preincremented copy。您可以将其视为按以下方式定义的函数:

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

如果您尝试在您的示例中使用该函数,您的编译器也会反对它。该函数的 return 值是一个 rvalue.

您现在可能会问 - 前缀 operator ++ 怎么了?这不也是一个 return 是一个值的函数吗? 答案是 - 。前缀operator ++ returns 引用,不是复制值,因此它的'outcome'可以和操作数&一起使用。