是否有可能讓第二個實例化以某種方式工作?我試過using
和= default
的組合,但無濟於事。我可以通過基礎的默認構造函數實例化一個結構體嗎?
struct A
{
int i;
};
struct B : A
{};
A a{11}; // This works.
B b{22}; // "No matching constructor".
是否有可能讓第二個實例化以某種方式工作?我試過using
和= default
的組合,但無濟於事。我可以通過基礎的默認構造函數實例化一個結構體嗎?
struct A
{
int i;
};
struct B : A
{};
A a{11}; // This works.
B b{22}; // "No matching constructor".
這不是A
的構造函數。這是聚合初始化。
無論如何,你註定了。雖然B
is-a A
,但沒有辦法通過B
將初始化傳遞給A
而沒有構造函數。可能有一些巫術和魔法,使它看起來像你通過B
初始化A
,但它會更好,只是寫一些好的,乾淨的代碼就像一個B
構造函數初始化現在A
struct B : A
{
B(int val):A{val}
{
}
};
明顯B
已一個構造函數和
B b{22};
是有效的。
根據該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
的參數。
好吧,這不是很酷。將會有一些有趣的新錯誤消息從這個變化中產生,但可能值得。更直觀一點。 – user4581301
等等,這並不排除有非聚合基類,那有什麼意義呢? –
@PasserBy對於基類,在支撐列表中使用初始值設定項來調用相應的構造函數。 –
顯然不是。構造函數不會被繼承。 –
任何初始化都不涉及構造函數。 – AnT