为什么他们要对特定的初始化列表进行特殊处理,而不是对它们进行相同的处理呢?
Why would they special-case certain initializer lists instead of treating them all the same?
假设我有一个变量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
变量总是成为一个初始化列表,而不是试图在某些特殊情况下推断出不同的类型,比如这个。
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 处理程序中的多个函数时.如何最好地处理他们的逻辑
- 为什么人物在处理他们之后会出现像
- 为什么他们要对特定的初始化列表进行特殊处理,而不是对它们进行相同的处理呢?