我有给定的代码,它会出错:
错误:'int&'类型的非const引用的初始化无效 来自'int'类型的右值const int b = f(a ++); ^
int f(int& a)
{
return a;
}
int main() {
// your code goes here
int a = 5;
int b = f(a++);
std::cout << b << std::endl;
return 0;
}
这个错误的原因是什么?
答案 0 :(得分:5)
您无法将临时绑定绑定到非const引用。
增量后(a++
)增加a
并返回一个包含a
旧值的临时值。
你为什么要通过非const
参考? - 看起来你并没有改变函数内部的参数,只是通过值或const
引用来传递。
如果您要更改参数,考虑到a++
已经改变了它,您会对行为有什么期望?改变是否直观?法律?
答案 1 :(得分:1)
int
上的后缀增量运算符返回临时值。临时值不能绑定到非const左值引用,因为修改临时值并不合理。您正在尝试将临时绑定到int&
,这会产生错误。
要解决此问题,请使用预增量运算符(++a
),或者按值获取参数(最好将内置类型作为值传递而不是const T&
):
int f(int a)
{
return a;
}
答案 2 :(得分:1)
此功能:
int f(int& a)
接受非const引用。此类引用必须始终指向位于某些内存位置的有效对象(*)。
后增量的工作原理如下:
- save current value as `r`
- increment original variable
- return `r`
这是因为后增量的结果是一个临时的,从增量前产生的值。这样的临时值必须作为值或const引用传递:
int f(int a) //This will work
int f(const int& a) //And this
(*)事实上,较旧的编译器允许这样的构造。例如,此代码将在VC6下编译:
struct T {};
void f(T& t)
{
}
int main()
{
f(T());
}
但是,此类行为不符合标准。