参考变量

时间:2015-10-02 16:07:27

标签: c++

为什么预增量工作但后增量不在参考变量上?

#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;

的右值

4 个答案:

答案 0 :(得分:8)

致电时

swap (a++,b++)

a++b++为您提供临时对象,因为后递增会返回先前的值。由于swap()通过引用获取其参数,因此它们无法绑定到这些临时值。使用++a++b工作,我们先增加ab,然后将其传递给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