使用带有虚函数的类的构造函数进行大括号初始化



我知道聚合不能有虚拟成员函数,但这段代码可以编译

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 元素组成的参数集的重载解析,但限制是只允许非收缩转换。如果此阶段生成显式构造函数作为复制列表初始化的最佳匹配项,则编译将失败(注意,在简单的复制初始化中,根本不考虑显式构造函数(。

相关内容

  • 没有找到相关文章

最新更新