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++“警告:返回对临时的引用”——但事实并非如此的主要内容,如果未能解决你的问题,请参考以下文章

C++ 级联类型转换

为啥 PHP 认为它正在写入文件,但事实并非如此?

C++ Windows 线程不会退出

C++ - 构造函数重载 - 私有和公共

GridSearchCV:基于 mean_test_score 结果,predict 应该表现得更差,但事实并非如此

C ++:内存管理[重复]