【问题标题】:invalid initialization of non-const reference of type 'int&' from a temporary of type 'int'从“int”类型的临时变量初始化“int&”类型的非常量引用无效
【发布时间】:2013-05-27 06:17:44
【问题描述】:
#include<iostream>
using namespace std;

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

谁能解释错误的原因?

谢谢

【问题讨论】:

  • 你正在传递常量10
  • code_hacker:引入了引用变量,以便函数中的变量更改可以反映在调用函数中,但不能修改常量,这就是为什么不能引用常量对象的原因(这是编译时间错误)。

标签: c++ reference temporary lvalue rvalue


【解决方案1】:

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

引入引用是为了解决 C(和更早的 C++)中的一个棘手问题,即所有内容都是按值传递的,如果您希望将更改反映回调用者,则必须传入一个指针并在函数中取消引用该指针以获取实际变量(用于读取和写入它)。

这是在下一个 ISO C 标准中非常很好的东西。虽然不得不使用指针可能会让我们中的一些人在 Stack Overflow 上获得很多声望,但这对世界上的 C 程序员来说并没有多大好处:-)

您的问题的解决方案很简单。如果不需要在函数中改变item,正常传递即可:

int fun (int x) { ... }

如果你确实需要改变它,那么你必须传递一些可以改变的东西:

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

【讨论】:

    【解决方案2】:

    我们可以将这个程序简化为:

    int& x = 10;
    

    这段代码不起作用的原因是因为 10 是一个右值,并且右值不能绑定到左值引用。如果这是真的,我们将能够更改文字的值(这在其他语言中是可能的,但在 C++ 中是不可能的)。

    【讨论】:

      【解决方案3】:

      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’

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-07
          • 2021-10-26
          • 1970-01-01
          • 2015-01-26
          • 1970-01-01
          • 2020-05-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多