C++指针引用问题,非常量引用的初始值必须为左值

不太明白为什么在参数里取地址再传进去就允许,左值的概念查过了,还是不太理解这个... 不太明白为什么在参数里取地址再传进去就允许,左值的概念查过了,还是不太理解这个 展开
 我来答
德克and德华

推荐于2017-11-25 · TA获得超过2650个赞
知道小有建树答主
回答量:1207
采纳率:100%
帮助的人:631万
展开全部
“非常量引用的初始值必须为左值”,左值基本上可以理解为能对其取地址的值,如果地址都没有,怎么可能作为非常量引用的值呢?如果可以,那么将出现以下情况:
int &a = 5;//5是右值,a是非常量引用
a = 6;//把5这个右值的值改为6,这明显是不合适的

“在参数里取地址再传进去就允许”这个不是很明白你想表达什么,对右值取地址?
更多追问追答
追问
其实是忘记传问题的图片了。。现在弄明白了。有这样一句话,非常量左值引用只能绑定到非常量左值,不能绑定到常量左值、非常量右值和常量右值,那对于func函数来说,func(&a)里面的&a应该算是非常量左值,还是常量右值?所以才不给引用绑定的
追答
&a是一个右值,你能对&a再取地址吗?肯定是不能的。&a本身就是一个数值,和5、6这些是一样的数值,只不过这个数值是一个地址值而不是一个int值。

int *c = &a;则完全不同了,c本身是一个左值,c是一个变量,c变量存放了&a所代表的值(就好比int a = 5,a存放了5代表的值),c本身也有自己的地址,你可以再对c作取地址操作。
大雅新科技有限公司
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,... 点击进入详情页
本回答由大雅新科技有限公司提供
谢应宸
2014-10-21 · TA获得超过2640个赞
知道大有可为答主
回答量:2731
采纳率:66%
帮助的人:2147万
展开全部
要理解这个先得理解左值和右值的概念
一个区分左值与右值的便捷方法是:看能不能对表达式取地址,如果能,则为左值,否则为右值。

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

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

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

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

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

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

如果你想使用这种方式,那么fun1函数也需要适当改变即可
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式