学习左值和右值.定义是任何可以是"地址"的是左值,否则,它是rvalue.
我检查了运算符优先级,前缀和后缀增量都比"地址"运算符具有更高的优先级.
对于以下两个例子,任何人都可以解释为什么第一个"&++ value1"是左值,而第二个"&value1 ++"是右值.
我对这两种情况的错误理解是:pValue1指向value1变量.无论在构建地址关联之前或之后将value1更改为8,value1变量总是占用一个内存位置,我们可以派生它的地址,对吧?
int value1=7;
int *pValue1=&++value1;
int *pValue1 = &value1++;
Run Code Online (Sandbox Code Playgroud)
Fur*_*ish 11
根据我的评论,你可以看到编译器反对这种操作的原因.问题在于postfix的一般实现operator ++,后者复制对象(int在这种情况下),递增原始对象并返回该预先增加的副本.您可以将其视为以下列方式定义的函数:
int foo_operator(int& a)
{
int copy = a;
a += 1;
return copy;
}
Run Code Online (Sandbox Code Playgroud)
如果您尝试在示例中使用该函数,则编译器也会对其进行抗议.该函数的返回值是一个右值.
您现在可能会问 - 前缀是operator ++什么?这不是一个返回值的函数吗?答案是 - 不.前缀operator ++返回引用,而不是复制值,因此它的"结果"可以与操作数一起使用&.