2017-02-19 77 views
0

編譯如下:警告:當地的臨時對象返回引用

namespace platform { 
    struct event {}; 
    struct keyboard_event : public event {}; 

    const platform::event& wait_event() 
    { 
    return platform::keyboard_event(); 
    } 
} 

int main(int argc, const char* argv[]) 
{ 
    const platform::event& event = platform::wait_event(); 
    return 0; 
} 

產生具有鐺以下警告

main.cc:7:12: warning: returning reference to local temporary object [-Wreturn-stack-address] 
    return platform::keyboard_event(); 
      ^~~~~~~~~~~~~~~~~~~~~~~~~~ 

然而,返回一個const引用的東西延長其使用壽命不就?

當前草案未加載用於我所以我會引用cppreference.com代替:

臨時對象的壽命可以通過結合到一個const左值參考或到一個rvalue參考被擴展(自C++ 11以來),請參閱參考初始化以瞭解詳細信息。

我怎樣才能重新寫這個有相同的效果,但避免警告?

+0

'platform :: keyboard_event()'是r值。你用'const&'綁定它並返回它。但是你不能返回temp或const的引用。這是經典的「返回臨時參考」警告。 – xinaiz

+0

如果您按照「請參閱參考初始化中的詳細信息」中的鏈接,cppreference繼續說「在返回語句中函數的返回值的臨時綁定不會被延長」 – Cubbi

回答

2

不,「返回參考」不會奇蹟般延長任何生命。

該壽命延長的唯一時間是當prvalue被綁定到一個參考可變,並且prvalue的壽命延長到該變量的:

struct Foo{}; 

{ 
    const auto & r = Foo{}; // Foo object not destroyed at semicolon... 
    // ... 
} 
// ... but is destroyed only here. 

你prvalue沒有結合到任何變量,因此沒有延長壽命。 (也請注意,非靜態類數據成員不會被視爲這個考慮因素的「變量」,所以如果您的類碰巧有參考成員,您也不能通過構造函數初始化程序列表來延長生命期。)

+0

好吧,然後粉筆以確保它可以處理未定義的行爲/運氣,堆棧沒有改變。因此,在任何情況下,通過const l-value或r-value引用延長壽命都不能用於通過引用返回? –

+0

@CasperBeyer不,只返回值 - 這種情況下罰款 –

+0

在這種情況下返回值將導致切片,否? (假設每個結構有不同的數據集) –

相關問題