Bjarne Stroustroup的C ++中所述的以下代码:编程和原理
struct Day {
vector <double> hour { vector <double> (24,-7777)}
};
struct Month {
vector <Day> day {32};
};
这段代码初始化32天,每天vector
为-7777
初始化的24小时;
问题是为什么列表初始化程序{32}
创建32天。 难道不是要以32个初始值来初始化vector
天而不是创建32个成员吗?
答案 0 :(得分:2)
否则,将分两个阶段考虑
T
的构造函数:所有将
的单个参数std::initializer_list
作为唯一参数的构造函数, 或作为第一个参数(如果其余参数具有默认值) 值进行检查,并通过过载分辨率与 类型为std::initializer_list
如果上一阶段未产生匹配项,则
T
的所有构造函数 参与针对一组参数的重载解析 由braced-init-list的元素组成,但有限制 仅允许非缩小转换。如果这个阶段 产生一个显式构造函数,作为与之的最佳匹配 复制列表初始化,编译失败(注意,简单 复制初始化,根本不考虑显式构造函数。
day
类型为vector <Day>
,其constructor taking std::initializer_list
作为参数需要一个std::initializer_list<Day>
,它不能由支撑初始化器{32}
构造。然后使用constructor taking size_type
并用vector
的32个默认插入的实例构造Day
。
另一方面,如果可以从Day
初始化int
,例如有一个采用int
的构造函数,则由于从std::initializer_list<Day>
到{32}
的隐式转换,所以可以从int
构造Day
,然后vector <Day> day {32};
使用从vector
初始化的一个元素构造32
。
答案 1 :(得分:0)
一个参数初始化器列表与带有一个参数的向量constructor匹配,该向量分配了那么多元素。在这种情况下32。