在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>考慮下面的程式碼片段:
我們能保證這個程式會輸出5而不會遇到未定義的行為嗎?這個問題特別是在透過引用([&])捕獲變數 x 時出現,並且涉及一旦函數 make_function 返回,捕獲對變數的引用是否會導致懸空引用。
答案:
是的,程式碼保證可以運作。
說明:C 11 lambda 規範顯示只要最初引用的物件仍然存在,此處擷取的引用就保持有效。這表示即使 make_function 中的參數 x 在函數傳回後超出範圍,lambda 閉包仍然保留對整數 i 的有效參考。
澄清:在這種特定情況下,變數x 位於 lambda 的可達範圍內,並透過引用捕獲。因此,引用仍然有效,並且 lambda 可以繼續存取 i 的修改值。
結論:此程式碼示範如何正確擷取引用lambda 中的參考。保證輸出 5 而不呼叫未定義的行為。以上是在 C 11 Lambda 中透過引用捕獲引用是否可以保證對修改值的存取?的詳細內容。更多資訊請關注PHP中文網其他相關文章!