C ++“警告:返回对临时的引用” - 但事实并非如此

时间:2012-04-15 16:31:13

标签: c++ qt gcc

我有一个非常简单的方法,并且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_是一个成员变量,它的下标运算符(它是QMap)返回一个引用,因此不应该有任何临时值,并且它在对象的生命周期内是持久的。
  2. 为什么警告出现在const重载而不是原始?
  3. 我可以#pragma该行隐藏警告,但我真的想知道它为什么会给我警告 - 有什么建议吗?

2 个答案:

答案 0 :(得分:8)

看起来[]的{​​{1}} - 运算符具有奇怪的语义,有时会生成对临时的const引用(如果没有给定键的元素),以及生命周期那个人的延伸得不够远。

请尝试QMap

答案 1 :(得分:2)

在QMap中,operator[]()有点古怪;它既可以在地图中插入(键,值)对,也可以用于查找值。文档说明:

  

要查找值,请使用operator或value():

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

如果地图中没有指定键的项目,则这些功能   返回默认构造的值。

如果指定的键不在映射中,则

QMap::value()返回默认构造的值 - 这意味着使用默认构造函数创建值。这是你得到的警告的临时性。虽然operator[]()不会以静默方式插入(键,值)对(如果它已经存在)(但如果它不存在),虽然我不确定警告但是使用.value()是可行的方法会消失。