【问题标题】:C++ "warning: returning reference to temporary " - But it isn'tC++“警告:返回对临时的引用”——但事实并非如此
【发布时间】:2023-03-27 08:03:02
【问题描述】:

我有一个非常简单的方法,并且它的 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 重载而不是原来的?

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

【问题讨论】:

  • 另一个使用 stdlib 容器而不是 Qt 的糟糕传真的理由。

标签: c++ qt gcc


【解决方案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 会创建条目,然后返回对该条目的引用,因此该引用将是持久的 - 但显然不是!
    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多