2011-09-07 55 views
12

我正在修復某些代碼中的另一個錯誤,並且遇到了一些我認爲是bug的代碼;但是,此代碼在gcc 4.4,4.5和4.6下編譯,並且看起來像「預期的」一樣起作用。任何人都可以告訴我,如果這是有效的C++?通過賦值給const引用的值返回

struct foo { 
    int bar; 
}; 

foo myfunction(foo const &orig) { 
    foo fooOnStack = orig; 
    fooOnStack.bar *= 100; 
    return fooOnStack; 
} 

void myOtherFunction(foo const &orig) { 
    foo const &retFoo = myfunction(); 
    // perhaps do some tests on retFoo.bar ... 
} 

如果這是有效的C++,有沒有人知道這背後的合法性是合法的?

+3

規範的基本原理概述在這裏:[GotW#88:候選人爲「最重要的常量」](http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-在最重要的const的/)。 – ildjarn

+0

此外,支持這種合法C++的標準是在C++ 03§12.2/ 5中。 – ildjarn

+0

謝謝,我今天學到了一些C++。它是有道理的,但我以前從未使用它,並且知道不允許返回到非const引用。 – graphicsMan

回答

24

是的,這是合法的C++。形成一個臨時的參考到臨時將臨時的生命週期延長到參考的生命週期。

-1

我認爲你還是要小心。我有一個情況,其中C++ 11和複雜的Eigen類型的g ++ - 4.9並不尊重它(即使它的生命週期應該被擴展,它也會刪除返回的臨時數據)。因此,即使它可能是合法的,它應該被標記爲狡猾,除非有充分的理由。另外,考慮到C++ 11必須在呼叫站點分配臨時數據(如果按值返回),其實用性可能比使用最新標準時的實用性要低。