非常量引用的初始值必须为左值 C++是怎么回事?

 我来答
谢应宸
推荐于2019-09-11 · TA获得超过2640个赞
知道大有可为答主
回答量:2731
采纳率:66%
帮助的人:2148万
展开全部
要理解这个先得理解左值和右值的概念
一个区分左值与右值的便捷方法是:看能不能对表达式取地址,如果能,则为左值,否则为右值。

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

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

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

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

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

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

如果你想使用这种方式,那么fun1函数也需要适当改变即可
大雅新科技有限公司
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,... 点击进入详情页
本回答由大雅新科技有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式