3

デストラクタが明示的に削除された型があります。その型のインスタンスを別のクラスのメンバーにしたいと思います。

私の予想では、含まれているクラスのインスタンスを削除しようとしない限り (つまり、含まれているクラスのデストラクタが無効になる)、問題はありません。

ただし、clang (v3.3) と g++ (v 4.6.3) の両方で、親クラスのコンストラクターをインスタンス化しようとするとエラーが発生します。

例えば:

class DeletedDtor 
{
  public:
    DeletedDtor() {}
    ~DeletedDtor() = delete;
};

class MyClass
{
  public:
    MyClass() = default;
    ~MyClass() = delete;

  private:
    DeletedDtor a;
};

int main() {
    MyClass *p = new MyClass();
}

g++ では、次のようになります。

test.cpp: In function ‘int main()’:
test.cpp:19:30: error: use of deleted function ‘MyClass::MyClass()’
test.cpp:11:5: error: ‘MyClass::MyClass()’ is implicitly deleted because the default definition would be ill-formed:
test.cpp:11:5: error: use of deleted function ‘DeletedDtor::~DeletedDtor()’
test.cpp:5:5: error: declared here

MyClass コンストラクターをデフォルトの実装にするのではなく、自分で定義することも役に立ちません。

class DeletedDtor 
{
  public:
    DeletedDtor() {}
    ~DeletedDtor() = delete;
};

class MyClass
{
  public:
    MyClass();
    ~MyClass() = delete;

  private:
    DeletedDtor a;
};

MyClass::MyClass() : a() {}

int main() {
    MyClass *p = new MyClass();
}

コンパイルエラーが発生します:

test2.cpp: In constructor ‘MyClass::MyClass()’:
test2.cpp:18:24: error: use of deleted function ‘DeletedDtor::~DeletedDtor()’
test2.cpp:5:5: error: declared here
4

4 に答える 4

4

あなたの質問は正しくありません。このクラスのメンバーのデストラクタは削除済みとして定義されているため、コンストラクターは削除済みとして定義されていますが、単に次のように書くことができます

DeletedDtor* d = new DeletedDtor();

すべて正常に動作するため (もちろん削除せずに)、gcc と clang はどちらも正しいです。

n3376 12.1/8

クラス X のデフォルトのデフォルト コンストラクタは、次の場合に削除済みとして定義されます。

— 直接または仮想基本クラスまたは非静的データ メンバーに 、デフォルトのデフォルト コンストラクターから削除またはアクセスできないデストラクタを持つ型があります。

于 2013-07-22T11:17:39.520 に答える
0

デストラクタを削除したクラスのインスタンスを保持することはできません。ただし、次へのポインターを保持できDeletedDtorますMyClass

class MyClass
{
  public:
    MyClass() = default;

  private:
    DeletedDtor* a;
};
于 2013-07-22T11:10:39.103 に答える