非常量引用的初始值必须为左值 C++

2025-01-29 06:10:19
推荐回答(1个)
回答1:

要理解这个先得理解左值和右值的概念
一个区分左值与右值的便捷方法是:看能不能对表达式取地址,如果能,则为左值,否则为右值。

那么举个例子先
int i = 5;
int &a = i;
这时编译通过
但是如果 int &a = 5;这样就出错了

这个5和i有什么区别,答案就是5是右值,i是左值,为什么,参考上面的话。

回到你的代码
你用一个函数的返回值给非常量引用初始化
那么函数的返回值是啥呢
在函数返回的时候,系统将返回值存放至eax寄存器,然后回到主函数中,eax寄存器存放的就是返回值,而这里这个返回值就是一个数值,不能对其取地址,所以这是一个右值

~~~~~~~~~~~~~~~~~~~~~~~~~~~~

如果不考虑代码的意义只为编译通过可以改成这样

int &k = *((int *)tmp.fun1());
这样就等于告诉编译器这个返回值是一个地址,然后用*运算对引用初始化,这个时候 *((int *)tmp.fun1())就是一个左值,所以能够编译通过

如果你想使用这种方式,那么fun1函数也需要适当改变即可