统一初始化是一个重要且有用的C++ 11功能。但是,你不能只用{}
无处不在,因为:为什么不是双花括号语法首选构造函数采用std :: initializer_list
std::vector<int> a(10, 0); // 10 elements of value zero
std::vector<int> b({10, 0}); // 2 elements of value 10 and 0 respectively
std::vector<int> c{10, 0}; // 2 elements of value 10 and 0 respectively
std::vector<int> d = {10, 0}; // 2 elements of value 10 and 0 respectively
auto e(0); // deduced type is int
auto f = 0; // deduced type is int
auto g{0}; // deduced type is std::initializer_list<int>
auto h = {0}; // deduced type is std::initializer_list<int>
注意到在例如集合初始化std::arrays
需要使用{{}}
,在我看来,与整个问题,其矢量构造函数将选择通过要求{{}}
本来是可以避免调用构造函数采取std::initializer_list
:
std::vector<int> i{10, 0}; // 10 elements of value zero
std::vector<int> j{{10, 0}}; // 2 elements of value 10 and 0 respectively
std::vector<int> k = {10, 0}; // 2 elements of value 10 and 0 respectively
auto l{0}; // deduced type is int
auto m{{0}}; // deduced type is std::initializer_list<int>
auto n = {0}; // deduced type is std::initializer_list<int>
我敢肯定这是讨论过的,所以反对这个的原因是什么?来自标准提案的报价/链接是首选答案。
更新。 - 有在N2532点,指出:
(3)只发生短初始化列表的可能讨厌不确定性的情况下[...]
(5)为什么要语言规则力的程序员谁想要简洁 和模糊控制(完美的理由)写更多 请程序员谁更喜欢(为了完美的原因)更多 显式 - 可以吗?
[...]
假设一个程序员期望F(X)被调用。 f(Y) 如何“劫持”呼叫? (4)假设X没有初始化列表构造函数,但是Y没有。在 这种情况下,给予初始化列表构造函数的优先级青睐劫持程序(记住我们假定程序员以某种方式预计f(X)被调用)。这类似于某人希望使用用户定义的转换调用f(X),并且有人来到 以及完全匹配的f(Y)。 我认为这将是公平的 期望有人谁使用{...}将记住 初始化器列表构造函数的可能性。 [重点煤矿]
我想关键在于可以,这意味着你不必使用统一的初始化。使用{}
正确是困难的,因为:
你不仅要检查你想打电话,但也为任何构造服用
initializer_list
可能赢得(可能会)在它的构造函数;如果在未来使用
{}
有人编写代码将一个std::initializer_list
构造你的代码可能会破坏和这样做默默。
即使你有一类A
与构造A(int, bool)
和A(std::initializer_list<double>)
,后者将在前者被选择为A a{0, false};
(其中IMO是坚果),所以我觉得它真的很难用统一的初始化在具有或可能有(需要水晶球超级大国)initializer_list
构造函数。
事实上,你的代码可以默默地打破我很多担心。
我不确定你试图解决哪个“问题”。你只是展示了一种不同的做事方式。我看到的唯一“问题”是'std :: array',可能需要两组大括号。但我认为这是正在解决的问题。 – juanchopanza
我试图解决的问题是找出为什么这种不同的做事方式不是标准化的(目前的做法)。特别是,我可能需要这个决定背后的原因或反对它的好例子才能得到满足。 – gnzlbg
我不认为有人会想'auto e {0,0};'是一个错误。我也不认为有人会希望它被视为逗号运算符的应用程序。唯一明智的类型是'std :: initializer_list'(或类似'int []'的东西)。但是,如果'auto e {(int列表)};'被解析为'std :: initializer_list ',并且'auto e {0};'的格式为'auto e {(list of int)} ;',那么它会导致特殊的不必要的复杂性,以便根据列表的长度添加特定的例外。 –
hvd