【问题标题】:why is reference initialization with 'operator ++' gives error为什么使用'operator ++'进行引用初始化会出错
【发布时间】:2014-08-06 09:58:11
【问题描述】:
#include<iostream.h> 
int main()
{
    int m = 2;
    int &x = m++;
    cout<<m;
    return 0; 
}

这段代码应该给出 输出: 3

但是这段代码给出了错误: 从“int”类型的临时变量初始化“int&”类型的非常量引用无效。

【问题讨论】:

  • int &amp;x = m++; 有什么用?
  • m++ 的结果是临时对象,其生命周期仅限于此行。它不能分配给参考 - 编译器消息非常清楚。 m++ 在临时对象中保留一个旧的 m 值,增加 m 的值,并返回具有先前 m 值的临时对象。
  • @FedericoReghenzani 它应该像“int &x= m; m++;”一样工作

标签: c++ reference


【解决方案1】:

后自增运算符返回一个在自增前值为m 的临时对象。 非 const 左值引用不能绑定到临时对象。因此,编译器理所当然地抱怨。

【讨论】:

  • @kkr_manit 我错过了“非常量”这个词。这意味着int const &amp;x = m++; 是合法的;)
【解决方案2】:

m++ 必须增加 m(作为副作用),但计算为原始值。它通过在增量之前返回一个保存 m 值的临时变量来做到这一点。

非常量左值引用不能绑定到临时对象。

你可以写:

int &x = ++m;

这是可行的,因为前自增运算符必须返回自增后的值,因此能够计算出对m 的左值引用。

但为了清楚起见,我不建议这样做。

【讨论】:

    【解决方案3】:

    您不能使用后增量来分配引用 - 它是一个临时对象

    【讨论】:

      【解决方案4】:

      这里

      int &x = m++;
      

      您正在将一个临时对象(右侧)分配给一个没有任何意义的引用(左侧)。

      改为:

      int &x = ++m;

      【讨论】:

        猜你喜欢
        • 2014-08-23
        • 1970-01-01
        • 2016-03-13
        • 1970-01-01
        • 1970-01-01
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多