15

プロジェクトで次のエラーが発生します。

エラー: 削除された関数 'C::C(int)' の使用 注: 'C::C(int)' は
デフォルトの定義は形式が正しくないため、暗黙的に削除されます。
エラー: 削除された関数 '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};

なぜこれが起こっているのか誰にも分かりますか?


明らかに、言語は継承されたコンストラクターの最後に初期化を追加しても構わないと思っています (既定のコンストラクターを呼び出す意思があるため)。そして明らかに、明示的に定義されたコンストラクターの最後に、デフォルト以外のコンストラクター (クラス内の初期化) への呼び出しを暗黙的に追加する意思があります。しかし、私には理解できない何らかの理由で、両方を同時に実行するつもりはありません。

この質問によると、完全な転送は実際には完全ではなく、ここでは使用しないでください。

注: 実際の場合、のコンストラクターBははるかに複雑であり、変更される可能性があるため、手動で転送することは実際には実行可能なオプションではありません。

4

1 に答える 1

6

これは GCC のバグであり、現在報告されています。

于 2014-08-29T22:25:47.667 に答える