首頁  >  文章  >  後端開發  >  從 C 函數傳回的 Braced-Init-List 的生命週期是多少?

從 C 函數傳回的 Braced-Init-List 的生命週期是多少?

Patricia Arquette
Patricia Arquette原創
2024-10-29 18:29:22650瀏覽

 What is the Lifetime of a Braced-Init-List Returned from a C   Function?

花括號初始化清單傳回值的生命週期

在C 中,從函數傳回花括號初始化清單會引發下列問題:

問題概要

之前的分析表明,GCC 在返回表達式結束之前錯誤地終止了initializer_list 數組,而Clang錯誤地保留物件而不破壞它們。

標準解釋

根據 C 11 標準,帶有花括號初始化列表的 return 語句透過以下方式初始化傳回值複製清單初始化。如果傳回類型是 std::initializer_list 的特化,則從指定清單建構並初始化一個initializer_list物件。

陣列生命週期

建構的initializer_list儲存一個對從初始值設定項列表初始化的元素數組的引用。此陣列的生命週期被定義為與initializer_list 物件相同。這表示在 return 語句中,底層陣列是從花括號初始化清單初始化的,並且其生命週期延伸到呼叫範圍。

正確實作

因此,預期的行為是,initializer_list 的陣列應保留到呼叫函數中,從而允許其進一步使用或綁定到命名引用。然而,GCC 目前的實現過早地釋放了數組,違反了這一期望。

其他說明

  • 傳回花括號初始化清單並不意味著複製 -傳回物件的構造。它只是使用copy-list-initialization來初始化回傳值。
  • DR 1290修改了與initializer_list生命週期相關的措辭,DR 1565和1599也在考慮中,可能會帶來進一步的變化。
  • 將附加引用綁定到initializer_list 不會延長其底層數組的生命週期,類似於對臨時物件的引用不會延長臨時物件的生命週期。

以上是從 C 函數傳回的 Braced-Init-List 的生命週期是多少?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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