花括號初始化清單傳回值的生命週期
在C 中,從函數傳回花括號初始化清單會引發下列問題:
問題概要
之前的分析表明,GCC 在返回表達式結束之前錯誤地終止了initializer_list 數組,而Clang錯誤地保留物件而不破壞它們。
標準解釋
根據 C 11 標準,帶有花括號初始化列表的 return 語句透過以下方式初始化傳回值複製清單初始化。如果傳回類型是 std::initializer_list 的特化,則從指定清單建構並初始化一個initializer_list物件。
陣列生命週期
建構的initializer_list儲存一個對從初始值設定項列表初始化的元素數組的引用。此陣列的生命週期被定義為與initializer_list 物件相同。這表示在 return 語句中,底層陣列是從花括號初始化清單初始化的,並且其生命週期延伸到呼叫範圍。
正確實作
因此,預期的行為是,initializer_list 的陣列應保留到呼叫函數中,從而允許其進一步使用或綁定到命名引用。然而,GCC 目前的實現過早地釋放了數組,違反了這一期望。
其他說明
以上是從 C 函數傳回的 Braced-Init-List 的生命週期是多少?的詳細內容。更多資訊請關注PHP中文網其他相關文章!