在 C 11 Lambda 中透過引用捕獲引用
在 C 11 中,我們經常使用 lambda 從周圍上下文中捕獲變數。但是當我們透過引用捕獲引用時會發生什麼?這樣做安全嗎?
問題詳細資訊
考慮以下程式碼:
<code class="cpp">#include <functional> #include <iostream> std::function<void()> make_function(int& x) { return [&]{ 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中文網其他相關文章!