簡體   English   中英

Lambda通過引用捕獲引用變量

[英]Lambda capture reference variable by reference

對於一個lambda,我想通過引用捕獲一些東西,它已經通過引用保存在外部作用域中。 假設引用的值超過lambda,但不是lamdba創建的范圍。

我知道如果lambda 按值捕獲引用變量,則會復制引用的對象。 我想避免這個副本。

但是如果我通過引用捕獲引用變量會發生什么? 如果在執行lambda之前原始引用變量超出范圍會怎么樣? 這樣安全嗎? 換句話說:引用的引用后面的對象是lambda中引用的引用變量嗎?

auto f() {
    const auto & myRef = g();
    return [&]{ myRef.doSomething(); };
}

f()();  // Safe?

是的,通過引用捕獲對象的關鍵問題是引用對象的生命周期,而不是用於獲取它的任何中間引用的生命周期。 您可以將引用視為別名而不是實際變量。 (在類型系統中,引用的處理方式與常規變量不同。)引用將原始對象別名化,並且與用於別名對象的其他別名無關(除了它們為同一對象設置別名的事實)。

=====編輯=====

根據對這個問題的答案(由dyp指出),似乎這可能不完全清楚。 在整個語言的其余部分,“引用參考”的概念沒有意義,並且從引用創建的引用成為該引用的同位體,但顯然該標准對於此案例和lambda捕獲有些模棱兩可。在某種意義上,引用可能是次要的,取決於捕獲它們的堆棧幀。 (SO答案引用的顯式措辭專門調用引用的實體,只要原始對象存在,表面上的表示這種用法是安全的,但綁定機制可能暗示捕獲鏈是重要的。)

我希望在C ++ 14/17中澄清這一點,我希望澄清它以保證這種用法的合法性。 特別是,我認為C ++ 14/17通過表達式捕獲變量的能力將使通過堆棧幀指針簡單地捕獲作用域變得更加困難,而最明智的捕獲機制通常是捕獲特定實體個別。 (如果通過引用捕獲實際的本地對象,則可能允許堆棧幀捕獲,因為如果在任何情況下在范圍外調用lambda,這將導致UB。)

在我們得到一些澄清之前,這可能不是便攜式的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM