2016-04-30 9 views
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; 
} 
+0

「カスタムデストラクタ」を定義します。すべてのデストラクタは、各クラスに対して「カスタム」です。 –

+0

"カスタム"とは、 'C'クラス(コード参照)で明示的に宣言されたデストラクタを意味します。 – aplavin

+0

スーパークラスは、サブクラスに明示的に宣言されたデストラクタを持たせることはできません。スーパークラスは、サブクラスに純粋な仮想メソッドを実装させることができます。しかし、デストラクタはメソッドではありません。各クラスにはデストラクタが必要です。デストラクタがなければ、デフォルトのデストラクタを取得します。 「カスタムデストラクタ」のようなものはありません。クラスインスタンスが破壊される唯一の方法があります。一般的に「デストラクタ」と呼ばれるのは、クラスインスタンスが実際に破棄される前に実行される、いくつかの無駄なコードです。クラスインスタンスがどのように破壊されるかは、C++標準によって明示的に定義されます。 –

答えて

1

あなたのコードが動作するためには、class Cは移動可能でなければなりません。デストラクタが宣言されていないときは、コンパイラが生成した暗黙的な移動コンストラクタ(および代入演算子)を取得します。しかし、デストラクタが宣言されているときには、ムーブコンストラクタ(および代入演算子)は暗黙的に提供されなくなります。これはあなたの安全のためです:明示的なデストラクタが必要な場合は、明示的な移動関数も必要であると想定されます。

参照:http://en.cppreference.com/w/cpp/language/move_constructor

関連する問題