問題: GCC 的實現破壞了a 是否正確破壞了std::initializer_list 陣列從傳回完整表達式末尾的函數傳回?
答案: 不,這是不正確的。
根據 C 11 標準,帶有花括號初始化列表的 return 語句會初始化複製列表初始化要從指定的初始值設定項列表返回的對像或引用。當使用初始化器清單建立initializer_list物件時,會指派一個陣列來儲存清單的元素。陣列的生命週期定義如下:
陣列的生命週期與initializer_list物件的生命週期相同。
在提供的範例中,initializer_list物件被建立為傳回來自 send() 函數的值。它使用三個noisydt 物件進行初始化,然後返回到receive() 函數。與initializer_list物件關聯的陣列的生命週期應該擴展到receive()函數中,允許存取和使用清單的元素。
但是,GCC實作錯誤地在傳回值之前銷毀了陣列可以使用,導致未定義的行為。正確的行為是數組持續存在,直到 receive() 函數結束。 Clang 和 ICC 都展示了正確的行為。
GCC 實作對 std::initializer_list 回傳值的處理不符合 C 11 標準。 Clang 和 ICC 提供了正確的實現,建議在使用 std::initializer_lists 時使用這些編譯器。
以上是GCC 是否會在傳回完整表達式結束之前銷毀從函數傳回的 `std::initializer_list` 陣列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!