首頁 > 後端開發 > C++ > GCC 是否會在傳回完整表達式結束之前銷毀從函數傳回的 `std::initializer_list` 陣列?

GCC 是否會在傳回完整表達式結束之前銷毀從函數傳回的 `std::initializer_list` 陣列?

Linda Hamilton
發布: 2024-10-29 09:35:30
原創
492 人瀏覽過

 Does GCC Destroy `std::initializer_list` Arrays Returned from Functions Before the End of the Return Full-Expression?

std::initializer_list 回傳值的生命週期

概述

問題: 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板