Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有虚函数的类的括号初始化_C++_C++11 - Fatal编程技术网

C++ 具有虚函数的类的括号初始化

C++ 具有虚函数的类的括号初始化,c++,c++11,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; } 为什么变量a的初始化有效,而变量b的初始化无效?a是一个聚合,因此可以有大括号初始化,

有以下代码:

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;
}

为什么变量
a
的初始化有效,而变量
b
的初始化无效?

a
是一个聚合,因此可以有大括号初始化,而
b
则没有,因为它有一个虚拟方法

8.5.1总量

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


大括号初始化仅适用于POD类型;让你的方法虚拟化,使它不被回答,但是没有必要符合“11标准”,因为答案在C++ 98、C++ 03和C++中完全相同。11@DavidRodr再次感谢你。我不确定这是否是用C++03中的聚合或POD来表达的。但是,您不能编写一个大括号初始值设定项构造函数吗?将初始值设定项列表作为参数?@DavidRodriguez在使用大括号的C++11中不会统一初始化被称为“大括号初始化”@Need4Sleep是的,在C++11中可以。