2013-05-16 30 views
7

类布雷斯初始化有此代码:与虚函数

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

+1

Brace初始化仅适用于POD类型;使你的方法虚拟化使它非POD – antlersoft

+2

[什么是聚合和荚以及它们是如何/为什么它们是特殊的](http://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods-and-how为什么他们特别) –

回答

10

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

8.5.1骨料

聚集是没有用户提供的构造(12.1),无支架或 - equal- 初始化用于非阵列或类(第9节)静态数据成员(9.2),没有私有或受保护的非静态数据成员(第11章), 没有基类(第10章),也没有虚拟函数(10.3)。

+1

答案是对的,但是没有必要用'11标准来限定,因为C++ 98,C++ 03和C++ 11的答案完全一样 –

+0

@DavidRodríguez-dribeas再次感谢。我不确定这是用C++ 03中的汇总还是POD来表示。 – juanchopanza

+0

难道你不能写一个大括号初始化构造函数吗?以初始化列表作为参数? –