15
我在我的項目遇到以下錯誤:繼承,構造函數+一流初始化非默認constructabe型失敗
error: use of deleted function ‘C::C(int)’ note: ‘C::C(int)’ is implicitly deleted because the default definition would be ill-formed: error: use of deleted function ‘M::M()’
這是我使用的代碼:
struct M {
M(int){}
M() = delete; // Allowing this would work.
};
struct B {
B(int) {}
B() = delete;
};
struct C : public B {
using B::B;
M n = {5};
// C(int i) : B(i) {} // Adding this would work
};
C c{1};
有誰知道爲什麼會發生這種情況?
顯然,語言願意附加在繼承的構造結束多個初始化(因爲它是願意叫一個默認的構造函數)。顯然,它願意隱式地將一個調用添加到非默認構造函數(在類初始化中)到明確定義的構造函數的末尾。但由於某種原因,我不明白,它不願意同時做兩個。
根據this question,完美的轉發並不是非常完美,不應該在這裏使用。
注意:在實際情況下,B
的構造函數更爲複雜且易於更改,因此手動轉發內容並不是真正的可行選項。
問題在刪除'B()'?編譯器不能編寫默認的'C()',因爲它需要默認的'B()'存在... – Arkadiy 2014-08-29 19:00:39
程序編譯時使用鏗鏘語言++ 3.5 – dyp 2014-08-29 19:03:43
據我瞭解標準,這個程序實際上很好-formed。隱式定義的'C(int)'ctor應該被定義爲'C(int p):B(static_cast(p)){}' –
dyp
2014-08-29 19:04:48