デストラクタが明示的に削除された型があります。その型のインスタンスを別のクラスのメンバーにしたいと思います。
私の予想では、含まれているクラスのインスタンスを削除しようとしない限り (つまり、含まれているクラスのデストラクタが無効になる)、問題はありません。
ただし、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