摘要訊息 : 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}; 是不可以通過編碼的.