2014-02-18 76 views
2

我正在查找std::map中的密鑰值。我碰到下面的錯誤數據集::的getProperty()內:std :: map :: at返回警告「返回引用臨時」在調用棧的某處

returning reference to temporary [-Wreturn-local-addr]

凡在調用堆棧是臨時產生的?我認爲std::map::at返回了一個左值的引用,並且因爲我不斷返回reference-to-const原始調用者將有一個左值的引用。

數據集

class Dataset 
{ 
    private: 
    PropertyCollection properties; 

    public: 
    const std::string & getProperty(const std::string & key) const; 

    ... 
} 

const std::string & Dataset::getProperty(const std::string & key) const 
{ 
    // WARNING: returning reference to temporary [-Wreturn-local-addr] 
    return properties.getProperty(key); 
} 

PropertyCollection

class PropertyCollection 
{ 
    private: 
    std::map<std::string, std::string> properties; 

    public: 
    const bmd2::string & getProperty(const bmd2::string & key) const 

    ... 
} 

const std::string & PropertyCollection::getProperty(const std::string & key) 
     const 
{ 
    try { 
    return properties.at(key); 
    } catch (std::out_of_range & e) { 
    ... 
    } 

int main() { 
    ... 
    std::string key ("Cats"); 
    std::string value = dataset.getProperty(key); 
} 

回答

10

getProperty返回bmd2::string而不是std::string。因此std::string必須隱含地構造/從bmd2::string轉換。這std::string當然是一個新的臨時對象。

雖然它實際上不是非法的返回引用臨時,使用這樣的引用(如果超出範圍)將導致UB,因此編譯器警告你。

+1

假設是'bmd2 :: string'和'std :: string'不是同一類型,我想。 –

+0

啊,隱式轉換!是的,它們不是同一類型。感謝你抓住這個Paranaix。 –

相關問題