统一初始化是C ++ 11的一项重要且有用的功能。但是,{}
由于以下原因,您不能随处使用:
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)被调用。af(Y)如何“劫持”电话?
(4)假设X没有初始化器列表构造函数,而Y有。在这种情况下,赋予初始值设定项列表构造函数的优先级优先于劫持者(请记住,我们假设程序员以某种方式希望调用f(X))。这类似于有人期望f(y)使用用户定义的转换来调用f(X),而有人带来了一个完全匹配的f(Y)。我认为可以期望使用{…}的人会记得初始化列表构造函数的可能性。[强调我的]
我猜关键在于can,这意味着您不必使用统一的初始化。{}
正确使用很难,因为:
您不仅要检查要调用的构造函数,还要检查任何采用initializer_list
可能会胜过(可能会胜过)的的构造函数;
如果您使用编写代码,{}
并且将来有人添加了std::initializer_list
构造函数,则您的代码可能会中断并以静默方式执行。
即使您有一个A
带有构造函数A(int, bool)
和的类,也将A(std::initializer_list<double>)
在后者上选择后者A a{0, false};
(对于IMO来说是螺母),所以我发现在具有或可能具有的类上使用统一初始化确实非常困难(需要水晶球超能力)构造函数。initializer_list
您的代码可以无声破解的事实令我非常担忧。
这是Stroustrup在这个问题上说的:
统一和通用并非仅是第四选择。它的目的是要在初始化语法和不幸[不]可行的所有遗留代码使用,尤其是
vector
。如果我vector
今天设计的话,您可能不得不说点什么vector<int> {Count{9}};
才能获得计数。
并回答“问题向量或{} -init语法是?”这个问题。
这是矢量设计:如果我
vector
今天设计的话,您可能不得不说点什么vector<int> {Count{9}};
来获得计数。更普遍的问题是,具有相同类型的几个语义上不同的参数最终会导致混淆,尤其是当它们可以形容词出现时。例如:
vector<int> v(7,2); // 7 (a count) element with the value 2
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句