0
宣言されたデストラクタを持つnoncopyable
クラスが必要で、単純なアプローチが動作しません。https://ideone.com/mU8aocを参照してください。デストラクタの問題は何ですか?なぜ、移動がそれなしで同じ方法で動作しないのですか?もちろん、それを修正する方法は?参考のためカスタムデストラクタで非コピー可能
、完全なコード(上記ideone
リンクによると同じ):
class noncopyable {
public:
noncopyable(noncopyable &&) noexcept;
noncopyable &operator=(noncopyable &&) noexcept;
protected:
noncopyable() = default;
~noncopyable() = default;
noncopyable(const noncopyable &) = delete;
noncopyable &operator=(const noncopyable &) = delete;
};
class C: noncopyable {
public:
// compiles if this line is uncommented
// C(C&& c);
C() {}
// also compiles if this is commented
~C() {}
};
C a() {
return {};
}
C b() {
return a();
}
int main() {
return 0;
}
「カスタムデストラクタ」を定義します。すべてのデストラクタは、各クラスに対して「カスタム」です。 –
"カスタム"とは、 'C'クラス(コード参照)で明示的に宣言されたデストラクタを意味します。 – aplavin
スーパークラスは、サブクラスに明示的に宣言されたデストラクタを持たせることはできません。スーパークラスは、サブクラスに純粋な仮想メソッドを実装させることができます。しかし、デストラクタはメソッドではありません。各クラスにはデストラクタが必要です。デストラクタがなければ、デフォルトのデストラクタを取得します。 「カスタムデストラクタ」のようなものはありません。クラスインスタンスが破壊される唯一の方法があります。一般的に「デストラクタ」と呼ばれるのは、クラスインスタンスが実際に破棄される前に実行される、いくつかの無駄なコードです。クラスインスタンスがどのように破壊されるかは、C++標準によって明示的に定義されます。 –