1

C++11 標準によれば、defaultキーワードを使用して、特別なメンバー関数をデフォルトとして宣言できます。

class Foo
{
public:
    Foo() = default;
    Foo(const Foo& source) = default;
    Foo(Foo&& source) = default;
    ~Foo() = default;
    Foo& operator=(const Foo& right) = default;
    Foo& operator=(Foo&& right) = default;
};

それらのカスタム実装が必要ない場合は、これらすべてのメソッドを明示的にデフォルト化または削除することを宣言することをお勧めします。たとえば、クラスにコピー コンストラクターとコピー代入演算子を実装する必要があります。コンパイラによって提供されるクラスと提供されないクラスを見るたびに考えないように、他のすべての特別なメンバー関数をdefaultorキーワードでマークする必要がありますか?delete

4

1 に答える 1

1

場合によります。コンパイラがこれらの関数を自動的に生成するタイミングとその有無については、ルールがあります。コンパイラがそれを行わず、必要な場合は、デフォルトを使用して強制的に生成するか、自分で実装することができます。コンパイラが関数を生成しない場合は次のとおりです (これは完全なリストではありません。コンパイラのドキュメントを参照してください)。

  • 引数を持つコンストラクターが宣言されている場合、デフォルトのコンストラクターは生成されません
  • コピー コンストラクターとコピー代入演算子を宣言すると、ムーブ コンストラクターとムーブ代入演算子は生成されません (逆も同様です)。

defaultしたがって、そのような場合、どこかで必要になることがわかっている場合は、 を使用してそれらを元に戻したいと思うかもしれません。ただし、ほとんどの場合、コンパイラに任せるべきです。これらの関数のいずれかが自動的に実装されていない場合、エラーが発生します。

PS Visual Studio は、ムーブ コンストラクターとムーブ代入演算子をまだサポートdefaultしていません。delete

于 2014-07-21T10:03:06.793 に答える