在C 11 Lambda 中透過引用擷取引用
此程式碼片段示範了在lambda 表達式中透過引用擷取整數引用:
此程式碼片段示範了在lambda 表達式中透過引用擷取整數引用:此程式碼是否保證在不呼叫未定義行為的情況下輸出5?
程式碼確實保證在不呼叫未定義行為的情況下運作。與按值捕獲 ([= x]) 相反,按引用捕獲 ([&x]) 利用 C 標準中的一個獨特異常,允許引用在其生命週期之外持續存在。這是因為 lambda 表達式捕獲的引用被實作為 lambda 閉包類型的成員存取。範圍和生命週期注意事項
需要注意的是,到達範圍規則因為 lambda 純粹是語法上的,在這種情況下不起作用。引用的實體 x 在 lambda 的可達範圍內,可以捕獲。標準寫法
根據[expr.prim.lambda]/17根據C 標準,只有透過copy 捕獲的表達式才會轉換為lambda 閉包類型的成員訪問。透過引用捕獲的表達式只是保持不變,並繼續表示原始實體。 此外,該標準沒有明確解決引用在其生命週期之外使用的問題。但是,由於在其生命週期之外使用引用不會受到任何懲罰(除非從其自己的初始化程序或前面的類別成員引用),因此允許此程式碼按預期運行。結論
在 C 11 lambda 中透過引用捕獲引用保證按預期工作,輸出引用整數的更新值,而不會調用未定義的行為。這是基於 lambda 捕獲的標準定義,以及在某些特定上下文中使用生命週期之外的引用時缺乏懲罰的規定。以上是在 C 11 Lambda 中透過引用捕獲引用是否保證輸出更新的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!