taking address of temporary错误

3 篇文章 0 订阅

前些天将一个项目从VS2013移植到Qt上,遇到了这样一个问题:

Dispatch->XCDispatchMessage(&linev());
//error:taking address of temporary
这段代码从VS2013通过了编译,但是到Qt上却出现了错误,于是上网百度,有一个人在编译OpenCV时也遇到了一样的问题:

cv::Mat centers;
int attempts = 1;
int flags = cv::KMEANS_PP_CENTERS;
cv::kmeans(sample_feature, k, tmp, cv::TermCriteria(), attempts, flags, ¢ers);
MyFunction myobject;
myobject.set(&CvMat(centers));//error:taking address of temporary [-fpermissive]
很明显,这都是因为引用返回的临时变量地址而引起的编译性错误。联想到之前的讨论,我将代码做了修改:

lin *plin=&linev();
Dispatch->XCDispatchMessage(plin);
结果还是一样的错误,思考了很久,我想到了这么办:

lin lin=linev();
lin *plin=&lin;
Dispatch->XCDispatchMessage(plin);
最后成功通过了编译,无警告。

从这个问题中我们可以看出使用非const引用引用返回的临时变量地址是确实不被允许的(如果使用const引用,可以延长变量生命周期到与引用同长),起码也会抛出一个警告


那这段代码为啥能在VS上通过编译呢?百度得知,这是VS2013的非标准扩展(默认打开,可关闭),自动在多种情况下扩展了被引用对象的生命周期


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值