Правило 3 ( правило 5 в новом стандарте c ++) гласит:
Если вам нужно явно объявить деструктор, конструктор копирования или оператор копирования, вы, вероятно, должны явно объявить все три из них.
Но, с другой стороны, « чистый код » Мартина советует удалить все пустые конструкторы и деструкторы (стр. 293, G12: Clutter ):
Какой смысл использовать конструктор по умолчанию без реализации? Все, что ему нужно, - это засорять код бессмысленными артефактами.
Итак, как справиться с этими двумя противоположными мнениями? Должны ли быть реализованы пустые конструкторы / деструкторы?
Следующий пример демонстрирует именно то, что я имею в виду:
#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
либо.