首頁  >  文章  >  後端開發  >  GCC 對傳回的 `std::initializer_list` 陣列的破壞是否正確?

GCC 對傳回的 `std::initializer_list` 陣列的破壞是否正確?

Linda Hamilton
Linda Hamilton原創
2024-11-01 17:08:02328瀏覽

Is GCC's Destruction of a Returned `std::initializer_list` Array Correct?

傳回的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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn