デストラクタ、コピーコンストラクタ、またはコピー割り当て演算子のいずれかを明示的に宣言する必要がある場合は、おそらく3つすべてを明示的に宣言する必要があります。
しかし、一方で、マーティンの「クリーンコード」は、すべての空のコンストラクターとデストラクターを削除することを推奨しています(293ページ、G12:Clutter)。
実装されていないデフォルトのコンストラクタはどのような用途に使用されますか?役目を果たすのは、意味のないアーティファクトでコードを混乱させることです。
だから、これらの2つの反対意見をどのように扱うのですか?空のコンストラクタ/デストラクタを実際に実装する必要がありますか?
次の例は、まさに私が意味することを示しています。
#include <iostream>
#include <memory>
struct A
{
A( const int value ) : v( new int( value ) ) {}
~A(){}
A( const A & other ) : v( new int( *other.v ) ) {}
A& operator=( const A & other )
{
v.reset( new int( *other.v ) );
return *this;
}
std::auto_ptr< int > v;
};
int main()
{
const A a( 55 );
std::cout<< "a value = " << *a.v << std::endl;
A b(a);
std::cout<< "b value = " << *b.v << std::endl;
const A c(11);
std::cout<< "c value = " << *c.v << std::endl;
b = c;
std::cout<< "b new value = " << *b.v << std::endl;
}
g ++ 4.6.1を次のように使用して正常にコンパイルします。
g++ -std=c++0x -Wall -Wextra -pedantic example.cpp
のデストラクタstruct A
は空であり、実際には必要ありません。だから、そこにあるべきですか、それとも削除されるべきですか?
virtual ~base () = default;
(正当な理由で)コンパイルされません
auto_ptr
どちらも使用すべきではありません。