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

invalid initialization of non-const reference of type 'int&', what the reason?

我有给定的代码,但出现错误:

error: invalid initialization of non-const reference of type 'int&' from an rvalue of type '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;
}

此错误的原因是什么?

您不能将临时引用绑定到非常量引用。

Post-increment (a++) 增加 a 和 returns 临时值 a 的旧值。

你为什么要通过非 const 引用? - 看起来你并没有在函数内部更改参数,只是按值或 const 引用传递。

如果您要更改参数,考虑到 a++ 已经更改了参数,您期望行为是什么?这种变化是直观的吗?合法吗?

int returns 临时值的后缀递增运算符。临时值不能绑定到非常量左值引用,因为修改临时值没有意义。您正在尝试将临时文件绑定到 int&,这会出错。

要解决此问题,请使用预递增运算符 (++a),或按值获取参数(最好将内置类型作为值而不是 const T& 传递):

int f(int a)
{
    return a;
}

这个函数:

int f(int& a)

接受非常量引用。此类引用必须始终指向驻留在特定内存位置 (*).

的有效对象

Post 增量工作如下:

 - save current value as `r`
 - increment original variable
 - return `r`

那是因为 post-incrementation 的结果是一个临时的,递增前的 yield 值。这种临时必须作为值或常量引用传递:

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

但是,这种行为不符合标准。