2

我有一个非常简单的方法,并且它的 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"
}

我不明白这个警告有两个原因:

  1. properties_是一个成员变量,它的下标运算符(它是 a QMap)返回一个引用,所以不应该有任何临时变量,并且它在对象的生命周期内是持久的。
  2. 为什么警告出现在 const 重载而不是原来的?

我可以#pragma隐藏警告,但我真的很想知道它为什么给我警告 - 有什么建议吗?

4

2 回答 2

8

看起来[]-operator forQMap具有奇怪的语义,有时会生成对临时的 const 引用(如果没有具有给定键的元素),并且该操作符的生命周期还不够长。

试试return properties_.find(property).value();吧。

于 2012-04-15T16:37:05.943 回答
2

在 QMap 中,operator[]()有点古怪;它既可以在映射中插入(键,值)对,也可以用于查找值。该文档指出:

要查找一个值,请使用运算符或 value():

int num1 = map["thirteen"];
int num2 = map.value("thirteen");

如果地图中没有具有指定键的项目,这些函数将返回一个默认构造的值。

QMap::value()如果指定的键不在映射中,则返回一个默认构造的值——这意味着一个值是使用默认构造函数创建的。这是您收到的警告所指的临时警告。operator[]()如果 (key, value) 对已经存在(但如果不存在),虽然不会静默插入,但 using.value()是可行的方法,尽管我不确定警告会消失。

于 2012-04-15T16:48:11.973 回答