前些天将一个项目从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的非标准扩展(默认打开,可关闭),自动在多种情况下扩展了被引用对象的生命周期