我有一个非常简单的方法,并且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
)返回一个引用,因此不应该有任何临时值,并且它在对象的生命周期内是持久的。我可以#pragma
该行隐藏警告,但我真的想知道它为什么会给我警告 - 有什么建议吗?
答案 0 :(得分:8)
看起来[]
的{{1}} - 运算符具有奇怪的语义,有时会生成对临时的const引用(如果没有给定键的元素),以及生命周期那个人的延伸得不够远。
请尝试QMap
。
答案 1 :(得分:2)
在QMap中,operator[]()
有点古怪;它既可以在地图中插入(键,值)对,也可以用于查找值。文档说明:
如果指定的键不在映射中,则要查找值,请使用operator或value():
int num1 = map["thirteen"]; int num2 = map.value("thirteen");
如果地图中没有指定键的项目,则这些功能 返回默认构造的值。
QMap::value()
返回默认构造的值 - 这意味着使用默认构造函数创建值。这是你得到的警告的临时性。虽然operator[]()
不会以静默方式插入(键,值)对(如果它已经存在)(但如果它不存在),虽然我不确定警告但是使用.value()
是可行的方法会消失。