3

我正在阅读有关参考资料的 Wikipedia 页面

它包含以下代码:

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&”类型的非常量引用的初始化无效</p>

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

4

3 回答 3

7

错误的原因是 post incrementx++返回一个临时值,并且 this 不能绑定到非 const 左值引用。这是同一问题的简化版本:

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.
于 2013-08-03T15:47:41.533 回答
0

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

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

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

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

于 2013-08-03T15:51:38.273 回答
0

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

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

}
于 2013-08-03T15:52:28.047 回答