首頁 > 後端開發 > C++ > 主體

`std::initializer_list` 傳回值的生命週期是否延伸到呼叫函數?

Patricia Arquette
發布: 2024-10-28 22:44:02
原創
996 人瀏覽過

Does the Lifetime of a `std::initializer_list` Return Value Extend into the Calling Function?

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

問題:

根據C 標準,當一個函數傳回一個標準,當一個函數傳回一個標準初始化列表,其底層數組的生命週期是否應該延伸到呼叫函數?

分析

C 標準規定 std::initializer_list 物件的生命週期與其初始化的物件相同。當函數傳回初始化列表時,它會初始化返回值物件。然而,涉及到初始化列表的兩個實例:函數中的一個和呼叫程式碼中的一個。

標準中的範例表明數組的生命週期延伸到複製到的對象,這意味著返回值的數組也應該在呼叫函數中保留。然而,實際情況並非如此。

答案:

目前,std::initializer_list 傳回值的生命週期行為在C 標準。不同的編譯器以不同的方式實現它:

  • GCC 在返回之前錯誤地銷毀數組,同時保留命名初始化列表。
  • Clang 正確處理標準中的範例,但從不銷毀物件中的物件清單。這會導致內存洩漏。
  • ICC 根本不支援初始化清單。

總之,目前不可能依賴 std:: 的生命週期initializer_list 回傳值擴展到呼叫函數中。避免使用 std::initializer_list 傳遞值,因為它可能會導致意外行為。

附加說明:

DR 1290 修改了標準的措辭,並且DR 1565 和 1599 仍處於開放狀態,解決了相關問題。然而,語義仍在定義中,編譯器需要時間來實現最終的變更。

以上是`std::initializer_list` 傳回值的生命週期是否延伸到呼叫函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!