【问题标题】:Reference-type return functions and postfix increment引用类型返回函数和后缀增量
【发布时间】:2013-08-03 15:44:47
【问题描述】:

我正在阅读the Wikipedia page about references

它包含以下代码:

int& preinc(int& x) 
{ 
    return ++x;  // "return x++;" would have been wrong
}

preinc(y) = 5; // same as ++y, y = 5

我确实尝试使用return x++; 而不是return ++x; 进行编译。正如预测的那样,这导致了以下错误:

错误:“int&”类型的非常量引用的初始化无效 来自“int”类型的临时

我不明白这个错误。我有一种模糊的直觉,即 x 的增量发生得太晚了(即,在 preinc 的函数调用结束之后)。但是,我不明白这是一个问题,因为变量 x 永远不会停止存在。欢迎任何解释。

【问题讨论】:

    标签: c++ reference post-increment


    【解决方案1】:

    错误的原因是后自增x++返回一个临时值,这不能绑定到非常量左值引用。这是同一问题的简化版本:

    int i = 42;
    int& j = i++; // Error: i++ returns temporary value, then increments i.
    const int& k = i++; // OK, const reference can bind to temporary.
    

    【讨论】:

    • 相关:i = i++ 是 C++11 中的 UB,但 i = ++i 不是 (amymore)。
    【解决方案2】:

    预增量 (++i) 执行增量,然后返回对变量的引用(已修改)。后增量 (i++) 计算增量的结果,将其存储在临时局部变量中,并在执行增量后返回该结果的副本。这样做是为了让增量在调用之后完成:

    int operator++(int)
    {
       int tmp( *this );
       ++(*this);
       return tmp;
    }  
    

    此代码用于学习目的,不是真正的代码(int 不是类)。用于展示后增量的工作原理。

    因此,如您所见,i++ 返回一个副本,而不是引用。所以你不能初始化返回值,因为它是一个右值,而不是对现有变量的引用。

    【讨论】:

      【解决方案3】:

      你可以在返回之前尝试增加 x 看看它是否解决了问题

      int& preinc(int& x) 
      { 
          x++;
          return x;  // "return x++;" would have been wrong
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-08
        • 2014-07-18
        • 1970-01-01
        • 1970-01-01
        • 2019-06-11
        相关资源
        最近更新 更多