5

コード:

struct A
{
    private:
    A() = default; // Version 1.
};
struct B : public A
{};

struct C
{
    private:
    C() {}; // Version 2.
};
struct D : public C
{};

int main()
{
   B b;  // Compiles          under g++ 4.7.2
   D d;  // Compilation error under g++ 4.7.2
}

そして2つの状況(gcc 4.7.2を使用):

  • このコードを(Aのコンストラクターのバージョン1を使用して)コンパイルしても、問題はありません。
  • D::D()2番目のコンストラクターを使用する場合、gccはそれがプライベートであると言います。

質問:デフォルトのコンストラクターを使用すると、なぜ問題が解消されるのですか?Aプライベートコンストラクターがある場合、他のクラスはA、そのコンストラクターの実装の「デフォルト」に関係なく、その派生クラスでさえも、のインスタンスを作成することはできません。

4

1 に答える 1

5

これは私にはGCCのバグのようなにおいがします。

メンバーのアクセス制御に関する第11条全体も、デフォルトのコンストラクターに関するセクション8.4.2も、デフォルトのコンストラクターのアクセシビリティのレベルをオーバーライドすることについては何も言及していません。

また、このコードはClang3.2およびIntelICC13.0ではコンパイルされません。

一方、X行をコメント化すると、次の行は思ったとおりに機能しません。

B b(); // This will declare a function that accepts no argument
       // and returns a value of type B

括弧を削除すると、問題がポップアップ表示されるはずです。

B b; // ERROR: Constructor of A is private

ただし、GCC 4.7.2は(誤って)コンパイルエラーを発生させません。また、これはGCC 4.8.0のベータ版(ビルド20130127現在)では修正されていないようです。

于 2013-02-22T17:20:20.450 に答える