右值不起作用参考

时间:2014-10-22 14:06:28

标签: c++ reference lvalue rvalue

我正在研究引用,我正在尝试一个程序将rvalue传递给函数作为引用参数,就像这样。

#include<iostream>
using namespace std;

int fun(int &x)
{
    return x;
}
int main()
{
    cout << fun(10);
    return 0;
}

但这并没有奏效,当我试图传递一个左值时,它有效。

#include<iostream>
using namespace std;

int fun(int &x)
{
    return x;
}
int main()
{
    int x=10;
    cout << fun(x);
    return 0;
}

有人能解释我为什么会这样吗?

2 个答案:

答案 0 :(得分:6)

rvalue 只能绑定到 rvalue 引用或const 左值引用;不是非const 左值引用。所以这些都可以起作用:

int fun(int const & x);
int fun(int && x);

这是为了防止令人惊讶的行为,其中函数可能会修改临时值而不是您认为可能的变量;例如:

void change(int & x) {++x;}

long x = 42;
change(x);
cout << x;   // would print 42: would have changed a temporary 'int', not 'x'

答案 1 :(得分:0)

您正尝试在fun(int &x)中传递引用。 &符号表示&#34;传递参数地址/引用&#34;。目前你正试图混合可修改的左值和常量右值,这是错误的 fun(const int &x)可以正常工作,这可能就是你想要做的。见this