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