无效初始化'int&'类型的非const引用来自'int'类型的临时

时间:2013-05-27 06:17:44

标签: c++ reference temporary lvalue rvalue

#include<iostream>
using namespace std;

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

有人能解释错误的原因吗?

由于

4 个答案:

答案 0 :(得分:12)

10是常量,所以你不能传递对它的引用,只是因为改变常量的整个概念是奇怪的。

引入了引用来解决C(和早期的C ++)中棘手的问题之一,事实上一切都是通过值传递的,如果你想让一个更改反映回调用者,你必须传入一个指针和取消引用函数中的指针获取实际变量(用于读取和写入)。

在下一个ISO C标准中,这是认真的好处。虽然必须使用指针可能会给我们中的一些人提供很多关于Stack Overflow的代表,但它并没有让世界上的C程序员做得更好: - )

解决问题的方法很简单。如果需要更改函数中的项目,只需正常传递:

int fun (int x) { ... }

如果您需要更改它,那么您必须传递可以更改的内容:

int xyzzy = 10;
cout << fun (xyzzy);

答案 1 :(得分:5)

我们可以将此计划缩短为以下内容:

int& x = 10;

此代码不起作用的原因是因为10是rvalue,并且rvalues无法绑定到lvalue-references。如果这是真的,我们将能够更改文字的值(这在其他语言中是可能的,但在C ++中不可能)。

答案 2 :(得分:2)

10这里是一个const数,你试图创建一个非const引用。将10存储在某些变量中,如

int x = 10

然后将其传递给函数或作为const进行引用。

const int &x

有没有C ++ 11那么你也可以使用右值参考的概念,所以它不会给出错误。

有关详细信息,请参阅error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’

答案 3 :(得分:1)

引用(&)必须指向(引用)变量。不能引用常量。