为什么预增量工作但后增量不在参考变量上?
#include <iostream>
void swap(int&, int&);
int main()
{
int x=10, y=20;
int &a=x, &b=y;
swap(++a, ++b); //swap (a++,b++) is not allowed.
printf("%d %d ", a, b);
return 0;
}
void swap(int& x, int& y)
{
x+=2;
y+=3;
}
为什么swap(++a, ++b)
允许,swap(a++, b++)
说:
[错误]无效初始化类型&#39; int&amp;&#39;的非const引用来自类型&#39; int&#39;
的右值
答案 0 :(得分:8)
致电时
swap (a++,b++)
a++
和b++
为您提供临时对象,因为后递增会返回先前的值。由于swap()
通过引用获取其参数,因此它们无法绑定到这些临时值。使用++a
和++b
工作,我们先增加a
和b
,然后将其传递给swap,这样就没有临时性。
答案 1 :(得分:1)
++ a返回l值但++返回r值。您需要将l值传递给swap()函数。
关于l-valu和r-value的相关帖子:postfix (prefix) increment, L-value and R-value (in C and C++)
答案 2 :(得分:1)
函数std::swap
必须交换两个变量的值,即左值引用。表达式x++
不是变量,而是值或rvalue。 rvalue不能绑定到左值参考。
右值和左值之间的差异可以这样解释:
int p;
/* p is left value, 3 is right value, ok */
p = 3;
但以下内容无效:
/* not ok, 3 is right value */
3 = p;
您发送给std::swap
的内容是两个数字值。
答案 3 :(得分:0)
传递左值/变量:
int x = 5, y = 9;
swap(x, y); // allowed bcos x and y are l-values / variables
预增(也预减):
int x = 5, y = 9;
swap(++x, ++y); // allowed bcos ++x and ++y are l-values
传递 r 值/值:
swap(5, 9); // NOT allowed bcos 5 and 9 are values (NOT variables)
后递增(也后递减):
int x = 5, y = 9;
swap(x++, y++); // NOT allowed bcos x++ and y++ are r-values