使用虚函数对类进行大括号初始化

scd*_*dmb 8 c++ c++11

有这个代码:

struct A {
   int x;
   void f() {}
};

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

A a = {2};

//B b = {3}; error: no matching constructor for initialization of 'B'

int main() {
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么变量的初始化a有效,但变量没有b

jua*_*nza 12

A是一个聚合,因此可以有大括号初始化,而B不是,因为它有一个虚方法.

8.5.1聚合

聚合是一个数组或类(第9节),没有用户提供的构造函数(12.1),非静态数据成员(9.2)没有大括号或相等的初始值,没有私有或受保护的非静态数据成员(第11条),没有基类(第10条),没有虚函数(10.3).