首頁 >後端開發 >C++ >在 C 11 Lambda 中透過引用捕獲引用是否可以保證對修改值的存取?

在 C 11 Lambda 中透過引用捕獲引用是否可以保證對修改值的存取?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-03 22:39:03453瀏覽

Does Capturing a Reference by Reference in C  11 Lambdas Guarantee Access to the Modified Value?

在C 11 Lambda 中透過引用擷取引用

問題:

問題:
<code class="cpp">#include <functional>
#include <iostream>

std::function<void()> make_function(int&amp; x) {
    return [&amp;]{ std::cout << x << std::endl; };
}

int main() {
    int i = 3;
    auto f = make_function(i);
    i = 5;
    f();
}</code>

考慮下面的程式碼片段:

我們能保證這個程式會輸出5而不會遇到未定義的行為嗎?這個問題特別是在透過引用([&])捕獲變數 x 時出現,並且涉及一旦函數 make_function 返回,捕獲對變數的引用是否會導致懸空引用。

答案:

是的,程式碼保證可以運作。

說明:

C 11 lambda 規範顯示只要最初引用的物件仍然存在,此處擷取的引用就保持有效。這表示即使 make_function 中的參數 x 在函數傳回後超出範圍,lambda 閉包仍然保留對整數 i 的有效參考。

澄清:
  • 為了解決先前回覆中的一些不準確之處:
C 中的「範圍」指的是代碼的靜態詞彙區域,其中非限定名稱查找將名稱與聲明相關聯。它與生命週期沒有直接關係。

lambda 的「到達範圍」規則根據語法規則決定何時允許捕獲,而不是生命週期。

在這種特定情況下,變數x 位於 lambda 的可達範圍內,並透過引用捕獲。因此,引用仍然有效,並且 lambda 可以繼續存取 i 的修改值。

結論:此程式碼示範如何正確擷取引用lambda 中的參考。保證輸出 5 而不呼叫未定義的行為。

以上是在 C 11 Lambda 中透過引用捕獲引用是否可以保證對修改值的存取?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn