C++“警告:返回对临时的引用”——但事实并非如此
Posted
技术标签:
【中文标题】C++“警告:返回对临时的引用”——但事实并非如此【英文标题】:C++ "warning: returning reference to temporary " - But it isn't 【发布时间】:2012-04-15 16:31:13 【问题描述】:我有一个非常简单的方法,并且它的 const 重载。
Sy_animatable::PropertyTimeLine&
Sy_animatable_imp::getPropertyTimeLine( const QString& property )
if ( !properties_.contains( property ) )
throw Sy_unknownAnimPropertyException( property );
return properties_[property];
const Sy_animatable::PropertyTimeLine&
Sy_animatable_imp::getPropertyTimeLine( const QString& property ) const
if ( !properties_.contains( property ) )
throw Sy_unknownAnimPropertyException( property );
return properties_[property]; // "warning: returning reference to temporary"
我不明白这个警告有两个原因:
properties_
是一个成员变量,它的下标运算符(它是一个 QMap
)返回一个引用,因此不应该有任何临时变量,并且它在对象的生命周期内是持久的。
为什么警告出现在 const 重载而不是原来的?
我可以#pragma
隐藏警告的行,但我真的很想知道它为什么给我警告 - 有什么建议吗?
【问题讨论】:
另一个使用 stdlib 容器而不是 Qt 的糟糕传真的理由。 【参考方案1】:看起来[]
的QMap
运算符具有奇怪的语义,有时会生成对临时的常量引用(如果没有具有给定键的元素),并且该运算符的生命周期不会延长太多够了。
改用return properties_.find(property).value();
。
【讨论】:
【参考方案2】:在 QMap 中,operator[]()
有点古怪;它既可以在映射中插入(键,值)对,也可以用于查找值。文档指出:
要查找一个值,请使用运算符或 value():
int num1 = map["thirteen"]; int num2 = map.value("thirteen");
如果map中没有指定key的item,这些函数 返回一个默认构造的值。
QMap::value()
如果指定的键不在映射中,则返回一个默认构造的值——这意味着一个值是使用默认构造函数创建的。这是您收到的警告所指的临时警告。虽然 operator[]()
不会在 (key, value) 对已经存在的情况下静默插入(但如果不存在),使用 .value()
是可行的方法,尽管我不确定警告会消失。
【讨论】:
我曾想过,但假设QMap
会创建条目,然后返回对该条目的引用,因此该引用将是持久的 - 但显然不是!以上是关于C++“警告:返回对临时的引用”——但事实并非如此的主要内容,如果未能解决你的问题,请参考以下文章