我知道聚合不能有虚拟成员函数,但是这段代码编译
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的元素组成的参数集的重载解析,限制条件是只允许非窄化转换。 如果此阶段产生显式构造函数作为复制列表初始化的最佳匹配,则编译失败(注意,在简单的复制初始化中,根本不考虑显式构造函数)。