摘要訊息 : C++ 17 對 auto
在初始化列表上的推導規則進行了一些變更.
0. 前言
C++ 11 引入了 auto
, 用於推導變數的型別, C++ 17 中對 auto
的推導規則進行了一定程度上的修改.
C++ 17 提案 N3922《New rules for auto deduction from braced-init-list》中提出了針對初始化列表的 auto
型別推導規則的修改.
更新紀錄 :
- 2022 年 5 月 12 日進行第一次更新和修正.
1. C++ 11 中的 auto
推導
在 C++ 11 和 C++ 14 之下, auto
對於初始化列表的推導是這樣的 : 當 auto
遇見初始化列表的時候, 自動被推導為 std::initializer_list
, 不論是否存在指派運算子; 其餘情況下, 正常進行推導. 也就是說在 C++ 17 之前, 實際上我們寫出 auto value {0};
或 auto value = {0};
這種宣告的時候, value
並沒有被推導為 int
型別, 而是被推導為 std::initializer_list<int>
型別.
2. C++ 17 中的 auto
推導
N3922 提出 :
- 如果初始化列表內有且唯有一個值, 若不存在指派運算子的情況下, 那麼型別推導為那個變數對應的型別. 也就是說,
auto value {0};
宣告中,value
會被推導為0
對應的型別, 即int
; - 如果初始化列表內的值多於一個且不存在指派運算子的情況下, 那麼推導是病式的, 一般情況下是拒絕進行推導. 即
auto value {1, 2, 3, 4};
是不可以通過編碼的.
自創文章, 原著 : Jonny. 如若閣下需要轉發, 在已經授權的情況下請註明本文出處 :