首頁 >後端開發 >C++ >在 C 11 Lambda 中透過引用捕獲引用安全嗎?

在 C 11 Lambda 中透過引用捕獲引用安全嗎?

Patricia Arquette
Patricia Arquette原創
2024-11-04 03:50:02365瀏覽

 Is Capturing a Reference by Reference in a C  11 Lambda Safe?

在 C 11 Lambda 中透過引用捕獲引用

在 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>

在此程式碼中,我們有一個lambda捕捉對整型變數i 的引用。然後我們在主函數中修改 i 並呼叫 lambda。問題是,lambda 會輸出 3 還是 5?

基於標準的答案

程式碼保證輸出 5,而不會呼叫未定義的行為。

說明

根據C 11 標準([expr.prim.lambda]/17),只有引用複製捕獲的實體的id 表達式才會轉換為成員訪問關於lambda 閉包類型。引用透過引用捕獲的實體的 Id 表達式將單獨保留,並且仍然表示它們在封閉範圍中表示的相同實體。

這表示 lambda 中的引用 x 不會改變。它仍然引用主函數中相同的整數變數 i。因此,當我們在主函數中修改 i 時,lambda 仍然會看到修改後的值。

以上是在 C 11 Lambda 中透過引用捕獲引用安全嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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