2013-05-16 33 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

難道你不能寫一個大括號初始化構造函數嗎?以初始化列表作爲參數? –