我正在阅读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&'类型的非const引用的初始化无效 来自临时的'int'类型
我不明白这个错误。我有一种模糊的直觉,即x的增量发生得太晚(即,在preinc的函数调用结束后)。但是,我不知道这是一个什么问题,因为变量x永远不会存在。欢迎任何解释。
答案 0 :(得分:7)
错误的原因是post increment x++
返回一个临时值,并且不能绑定到非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.
答案 1 :(得分:0)
preincrement(++i
)执行增量,然后返回对变量的引用(Wich已被修改)。 Postincrement(i ++)计算增量的结果,将其存储在临时局部变量中,并在执行增量后返回该结果的副本。这样做是为了看看在调用之后完成增量:
int operator++(int)
{
int tmp( *this );
++(*this);
return tmp;
}
此代码用于学习目的,不是真正的代码(int不是类)。用于显示后增量的工作原理。
因此,正如您所看到的,i++
会返回副本,而不是引用。所以你不能初始化返回值,因为它是一个rvalue,而不是对现有变量的引用。
答案 2 :(得分:0)
你可以尝试在返回x之前递增x并查看它是否解决了问题
int& preinc(int& x)
{
x++;
return x; // "return x++;" would have been wrong
}