2017-06-14 66 views

回答

1

這不是A的構造函數。這是聚合初始化。

無論如何,你註定了。雖然B is-a A,但沒有辦法通過B將初始化傳遞給A而沒有構造函數。可能有一些巫術和魔法,使它看起來像你通過B初始化A,但它會更好,只是寫一些好的,乾淨的代碼就像一個B構造函數初始化現在A

struct B : A 
{ 
    B(int val):A{val} 
    { 
    } 
}; 

明顯B已一個構造函數和

B b{22}; 

是有效的。

4

根據該C++ 2014標準(8.5.1聚集體):

1所述的骨料是沒有用戶提供的 構造(12.1),無私人或陣列或類(第9節)受保護的非靜態數據成員 (第11章),沒有基類(第10章),沒有虛函數 (10.3)。

然而根據該C++ 2017標準(8.6.1聚集體):

1所述的聚集物是與

(1.1)的陣列或一個類(第9) - 沒有用戶-provided,明確的,或繼承的構造(12.1),

(1.2) - 沒有私有或保護非靜態數據成員(第11),

(1.3) - 無虛擬功能(10.3)和

(1.4) - 沒有虛擬,私有或受保護的基類(10.1)。

正如您所看到的,C++ 2017 Standard刪除了聚合不應具有基類的限制。所以代碼不會被不支持C++ 2017標準的編譯器編譯。

您需要明確聲明一個構造函數,它自己除了類B的參數。

+0

好吧,這不是很酷。將會有一些有趣的新錯誤消息從這個變化中產生,但可能值得。更直觀一點。 – user4581301

+0

等等,這並不排除有非聚合基類,那有什麼意義呢? –

+0

@PasserBy對於基類,在支撐列表中使用初始值設定項來調用相應的構造函數。 –

相關問題