本质上是一团糟。对于 C++11,它试图创建一种统一的方法来初始化对象,而不是其他必要的多种方法:
T v(args...);
对于通常情况
T d = T();
对基于堆栈的对象使用默认构造函数时
T m((iterator(x)), iterator());
对抗Most Vexing Parse(注意第一个参数周围的额外括号)
T a = { /* some structured values */ };
用于聚合初始化
而是发明了统一初始化语法:
T u{ /* whatever */ };
其目的是在任何地方都使用统一的初始化语法,而旧的 stule 会过时。一切都很好,除了初始化的支持者std::initializer_list<S>
意识到语法是这样的:
std::vector<int> vt({ 1, 2, 3 });
std::vector<int> vu{{ 1, 2, 3 }};
这被认为是不可接受的,并且统一的初始化语法受到了不可挽回的损害,以允许更好的
std::vector<int> vx{ 1, 2, 3 };
这种混合的问题在于,现在有时不清楚实际含义是什么,并且统一初始化语法不再统一。在某些情况下它仍然是必要的(尤其是在通用代码中初始化基于堆栈的对象),但它并不是在所有情况下都是正确的选择。例如,以下两个符号的意思是相同的,但它们不是:
std::vector<int> v0(1, 2); // one element with value 2
std::vector<int> v1{1, 2}; // two elements: 1 and 2
tl;dr:初始化列表和统一初始化语法是两个独立的符号。可悲的是,它们发生了冲突。