- 现代C++编程实战:132个核心技巧示例(原书第2版)
- (罗)马里乌斯·班西拉
- 276字
- 2024-06-06 17:45:11
1.3.4 更多
以下示例展示了直接列表初始化和复制列表初始化。在C++11中,所有这些表达式的推导类型均为std::initializer_list<int>:

C++17修改了列表初始化的规则,区分了直接列表初始化和复制列表初始化。类型推导的新规则如下:
❍ 对于复制列表初始化,如果列表中的所有元素具有相同的类型,auto会被推导为std::initializer_list<T>,否则推导格式错误。
❍ 对于直接列表初始化,如果列表中只有一个元素,auto会被推导为T,如果有不止一个元素,则推导格式错误。
基于这些新规则,之前的示例将发生如下变化(注释中描述了推导出的类型):

在这个示例中,a和c被推导为std::initializer_list<int>,b被推导为int,d用的是直接列表初始化而且初始化列表不止一个元素,所以导致编译失败。