提问者:小点点

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


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

struct B {
    B(int yIn) :y(yIn) {}
    int y;
    virtual void f() {}
};

B b = {3}; 

大括号初始化与聚合初始化不同吗?还是此类由于其构造函数而成为有效的聚合?


共1个答案

匿名用户

b不是聚合类型,它不能具有虚拟成员函数。 因此b b={3};不会执行聚合初始化,而是执行复制列表初始化(自C++11以来)。相反,会调用构造函数b::b(int)来初始化对象。

>

  • 否则,将分两个阶段考虑t的构造函数:

    >

  • .。。

    如果前一阶段没有产生匹配,则T的所有构造函数都参与针对由带括号的init-list的元素组成的参数集的重载解析,限制条件是只允许非窄化转换。 如果此阶段产生显式构造函数作为复制列表初始化的最佳匹配,则编译失败(注意,在简单的复制初始化中,根本不考虑显式构造函数)。