现代C++编程实战:132个核心技巧示例(原书第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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用的是直接列表初始化而且初始化列表不止一个元素,所以导致编译失败。