无效初始化类型' int&'的非const引用,原因是什么?

时间:2015-04-21 13:24:02

标签: c++ function reference post-increment

我有给定的代码,它会出错:

  

错误:'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;
}

这个错误的原因是什么?

3 个答案:

答案 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());
}

但是,此类行为不符合标准。