为什么他们要对特定的初始化列表进行特殊处理,而不是对它们进行相同的处理呢?

Why would they special-case certain initializer lists instead of treating them all the same?

本文关键字:处理 他们 初始化 列表 为什么      更新时间:2023-10-16

假设我有一个变量auto x,我想用大括号初始化7,简单:

auto x {7};

除了我了解到x是不是一个整数,而是一个初始化列表本身。为什么?委员会决定auto应该在单个auto值的情况下获取初始化列表是否有特定的原因,或者他们希望我们意识到这些不应该一起使用。我似乎想不出一个可能的原因,我想要一个初始化列表存储到auto中,而不是值

一个非常实际的答案是,"为什么要选择int ?"或者double,或者任何带有int单参数构造函数的UDT ?通过拒绝推导具体类型,编译器保留了更通用的初始化列表的任何可能的应用。

另一方面,能够为T推导出initializer_list<X>是有吸引力的,允许:

auto x = { 1, 1, 2, 3, 5 };  
f(x);   
g(x); 

在EWG讨论初始化列表的一开始就被认为是可取的行为。

与其为参数类型T匹配{}-list(这是我们在本文的早期草图和草稿中所追求的一个选项)提出一个聪明的推导规则,我们现在更倾向于在初始化项为{}-list时使用"自动"变量推导的特殊情况来处理这个问题。也就是说,对于使用"auto"类型说明符和{}列表初始化器声明的变量的特定情况,"auto"被推断为函数f(initializer_list<T>)而不是function f(T)

参见本PDF中的"模板参数推导"一章。http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2640.pdf

对于c++ 14之后的版本,有一篇论文建议修改这些规则,以便在单元素情况下将类型推断为初始化器的类型。提出了零元和多元情况是病态的。http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3681.html

我认为原因是auto总是以相同的方式与初始化列表交互。换句话说,auto变量总是成为一个初始化列表,而不是试图在某些特殊情况下推断出不同的类型,比如这个。