2012-04-15 41 views
2

我有一個非常簡單的方法,並且它的const超載。C++「警告:返回引用臨時」 - 但它不是

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該行隱藏警告,但我真的想知道爲什麼它給了我警告 - 有什麼建議嗎?

+0

使用stdlib容器而不是Qt的可憐傳真的另一個原因。 – ildjarn 2012-04-15 17:10:55

回答

8

看起來像[]-QMap的操作員有奇怪的語義,有時會生成一個臨時引用(如果沒有給定鍵的元素),並且該擴展的生命週期不夠長。

嘗試用return properties_.find(property).value();代替。

+0

這樣做了,謝謝! – cmannett85 2012-04-15 16:52:13

2

在QMap中,operator[]()有點古怪;它既可以在地圖中插入(鍵,值)對,也可以用於查找值。該文件指出:

要查找的值,使用運營商或值():

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

如果與地圖中指定鍵的項目,這些功能 返回默認 - 構建的價值。

QMap::value()如果指定的鍵不在映射中,則返回默認構造的值 - 這意味着使用默認構造函數創建值。這是暫時的,你所得到的警告是指。雖然operator[]()不會默默插入(鍵,值)對(如果它不存在),但使用.value()即可,但我不確定該警告是否會消失。

+0

我曾經想過,但是認爲'QMap'會創建條目,然後返回對條目的引用,所以引用將持久 - 但顯然不是! – cmannett85 2012-04-15 16:54:08