傳回的std::initializer_list 陣列的生命週期
從函數傳回的std::initializer_list 陣列的生命週期引發了不同陣列的生命週期編譯器中的行為。問題是 GCC 在傳回完整表達式末尾對陣列的破壞是否正確。
標準分析
依 C 11 §6.6。 3/2,帶有花括號初始化清單的 return 語句會導致傳回的物件或參考從初始化清單中複製清單初始化。此程序從初始化器列表初始化一個臨時的initializer_list物件及其底層數組存儲,然後從第一個初始化另一個initializer_list。
陣列的生命週期,如8.5.4/6定義,與initializer_list 物件的生命週期。這可以透過一個範例來理解,其中,initializer_list 物件和陣列對於使用花括號初始化列表初始化的 std::vector 具有完整表達式生命週期。
花括號初始化的回傳值-List
當傳回用大括號括起來的裸清單時,使用複製清單初始化。這類似於語法 nocopy X = { 3 },不涉及複製,並且與 8.5.4/6 中延長數組生命週期的範例相同。
GCC 問題和 Clang
但是,GCC 和 Clang 之間的實現存在差異。 GCC 在返回之前銷毀數組,而 Clang 保留一個命名的initializer_list,但從不銷毀列表中的物件。
建議
建議避免使用 std:: initializer_list 傳遞值並期望它們持續存在。標準和編譯器實現的不確定性使其在保留物件生命週期方面不可靠。
以上是GCC 對傳回的 `std::initializer_list` 陣列的破壞是否正確?的詳細內容。更多資訊請關注PHP中文網其他相關文章!