C++ 为什么他们要对某些初始值设定项列表进行特殊处理,而不是一视同仁?

C++ 为什么他们要对某些初始值设定项列表进行特殊处理,而不是一视同仁?,c++,c++11,auto,list-initialization,C++,C++11,Auto,List Initialization,假设我有一个变量auto x,我想使用大括号初始化将其初始化为7,简单: auto x {7}; 不过我知道x不是整数,而是初始化列表本身。为什么?有没有具体的原因让委员会决定,如果只有一个自动值,auto应该获取初始化列表,或者他们希望我们意识到这些值不应该一起使用我似乎想不出一个可能的原因,我希望将初始化列表存储到auto中,而不是值我假设原因是soauto总是以相同的方式与初始化列表交互。换句话说,auto变量总是成为一个初始化列表,而不是在像这样的特殊情况下试图推断不同的类型。一个非常

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

auto x {7};

不过我知道x不是整数,而是初始化列表本身。为什么?有没有具体的原因让委员会决定,如果只有一个自动值,
auto
应该获取初始化列表,或者他们希望我们意识到这些值不应该一起使用我似乎想不出一个可能的原因,我希望将初始化列表存储到auto中,而不是值

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

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

另一方面,能够推导出
T
初始值设定项列表
,有助于:

auto x = { 1, 1, 2, 3, 5 };  
f(x);   
g(x); 
自从EWG开始讨论初始值设定项列表以来,这被认为是可取的行为

对于与{}列表匹配的参数类型
T
(这是我们在本文早期草图和草稿中追求的一个选项),我们现在不想提出一个聪明的推断规则,而是更愿意在初始值设定项为{}列表的情况下处理“自动”变量推断的特殊情况。也就是说,对于使用“auto”类型说明符和{}-列表初始值设定项声明的变量的特定情况,对于函数
f(初始值设定项{u列表)
,而不是
函数f(T)
,推导出“auto”

请参阅本PDF中的“模板参数推断”一章


对于after-C++14,有一篇文章建议更改这些规则,以便单元素案例将类型推断为初始值设定项的类型。零元素和多元素情况被认为是病态的

也许真正的问题是“为什么他们会对某些初始值设定项列表进行特殊处理,而不是一视同仁?”@Mark B这感觉比我的标题更深入。请随意为销售代表编辑,我不会从你那里偷走它。好的。那么,对于只有一个参数的初始化列表,您建议使用什么语法呢?这是一个不令人满意的答案。为什么选择初始值设定项列表?为什么不是tuple?他们这样做的方式,对于
autox{1,true}是失败的。因此,您给出的理由本身就是伪造的。您是指14.8.2[临时扣减]?更新:N3681提案(EWG第73期)似乎已被拒绝(“没有一致意见进行更改(担心违反现有代码)”: