首頁 > 後端開發 > C++ > 為什麼在 GCC 4.6.1 中使用初始化清單初始化 std::array 會導致編譯錯誤?

為什麼在 GCC 4.6.1 中使用初始化清單初始化 std::array 會導致編譯錯誤?

DDD
發布: 2024-10-29 09:51:30
原創
615 人瀏覽過

Why Does Initializing std::array with an Initialization List Cause a Compilation Error in GCC 4.6.1?

將std::array 與初始化清單一起使用:編譯器難題

雖然將初始化清單與std::array 一起使用的語法可能看起來像簡單地說,一些用戶在嘗試實現它時遇到了困難。問題中提供的範例:

<code class="cpp">std::array<std::string, 2> strings = { "a", "b" };</code>
登入後複製

由於逗號之前的意外標記而導致 GCC 4.6.1 中出現編譯錯誤。這種與 std::vector 的行為不一致(它毫無問題地接受初始化列表)導致了對語法有效性的混亂和猜測。

深入研究std::array 的本質

要理解這種差異,有必要檢查std::array:

<code class="cpp">template<typename T, int size>
struct std::array
{
  T a[size];
};</code>
登入後複製

從這個定義可以明顯看出,std::array 本質上是一個結構體包含一個陣列。它缺少直接接受初始化列表的建構函數。但是,根據 C 11 的規則,std::array 被視為聚合。這允許聚合初始化,其中涉及間接初始化數組的元素。

克服語法謎

要使用聚合初始化成功初始化std::array,需要一組額外的大括號:

<code class="cpp">std::array<std::string, 2> strings = {{ "a", "b" }};</code>
登入後複製

透過巢狀大括號,編譯器可以辨識初始化結構中陣列元素的意圖。這消除了第一個範例中遇到的編譯錯誤。

GCC 錯誤或標準不規則?

有趣的是,C 標準意味著在此可以省略額外的大括號具體案例。因此,GCC 4.6.1 可能遇到一個錯誤,無法正確解釋簡化語法。

以上是為什麼在 GCC 4.6.1 中使用初始化清單初始化 std::array 會導致編譯錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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