我知道聚合不能有虚拟成员函数,但这段代码可以编译
struct B {
B(int yIn) :y(yIn) {}
int y;
virtual void f() {}
};
B b = {3};
大括号初始化是否与聚合初始化不同,或者此类是否因其构造函数而成为有效的聚合?
是的,B
不是聚合类型,它不能具有虚拟成员函数。因此,B b = {3};
不会执行聚合初始化,而是执行复制列表初始化(自 C++11 起(,作为效果,调用构造函数B::B(int)
来初始化对象。
否则,
T
的构造函数将分两个阶段进行考虑:
。
如果上一阶段未产生匹配项,则
T
的所有构造函数都参与针对由大括号 init-list 元素组成的参数集的重载解析,但限制是只允许非收缩转换。如果此阶段生成显式构造函数作为复制列表初始化的最佳匹配项,则编译将失败(注意,在简单的复制初始化中,根本不考虑显式构造函数(。