2016-04-22 159 views
4

使用C++ lambda表達式時,通過引用捕獲參考時會發生什麼? 您是捕獲對堆棧上的本地對象(引用本身)的引用,還是對引用的對象的引用? 如下面的代碼:使用C++ lambda表達式,通過引用捕獲引用的規則是什麼?

int& TestClass::returnReference() 
{ 
     static int i=0; 
     return i; 
} 

std::function<void()> TestClass::testFunction() 
{ 
     int& memberRef = this->someIntMember; 
     int& intRef = returnReference(); 

     auto lambda = 
     [&] 
     { 
       // What happens when you capture a reference by reference 
       // like memberRef or intRef? 
     }; 

     return lambda; 
} 
+3

相關[在C++ 11 lambda中通過引用捕獲引用](http://stackoverflow.com/questions/21443023/capturing-a-reference-by-reference-in-a-c11-lambda)? – sergej

+1

我認爲(實際上,希望)該語言的意圖是,你得到了引用變量引用的對象的引用,但是@ sergej的鏈接讓我懷疑...... – molbdnilo

回答

6

標準實際上授權它需要捕捉變量,而不是它所引用。這是標準中的一個錯誤,也是C++中唯一可能發生這種事情的情況。

有一個defect report and suggested resolution(謝謝@ t.c。),它改變它來捕獲提到的eintity。

理論上,有一種低成本的參考捕獲技術捕獲堆棧指針並使用在lambda聲明處已知的偏移量(加上可能爲this),這將使用我們只需要捕獲參數的事實不是內容。然而,沒有編譯器我知道使用它,並且缺陷報告意味着你不能在本地/全局變量中引用不能被這種方式處理。

總之,標準說錯了,但沒有實際問題,因爲沒有編譯器遵循標準的字母,而是做了正確的事情。而未來的編譯器必須違反建議的缺陷解決方案纔會有不良行爲。

+1

[CWG2011](http:// wg21。鏈路/ CWG2011)。 –

相關問題