Зачем вам «по умолчанию» конструктор копирования / перемещения или деструктор? - PullRequest
7 голосов
/ 27 сентября 2010

C ++ 0x позволяет указывать определенные функции по умолчанию:

struct A {
  A() = default;          // default ctor
  A(A const&) = default;  // copy ctor
  A(A&&) = default;       // move ctor
  A(Other);               // other ctor

  ~A() = default;         // dtor

  A& operator=(A const&) = default; // copy assignment
  A& operator=(A&&) = default;      // move assignment
};

Реализация этих функций такая же, как если бы их сгенерировал компилятор, что обычно происходит в большинстве случаев, когда вы неt объявляйте свой собственный.

Ctor по умолчанию не генерируется, если вы объявляете любой ctor (любой из других выше), поэтому вам может потребоваться установить его по умолчанию, чтобы «вернуть его».

Однако, если базовый элемент или элемент данных не исключает их, класс всегда имеет копию и перемещение ctor⁠ - и, если они исключены, реализация по умолчанию не будет работать.У класса всегда есть dtor.

Зачем вам нужно явно задавать по умолчанию копию ctor, move ctor или destructor?Разве неявно сгенерированные реализации не будут делать то же самое?

Ответы [ 2 ]

11 голосов
/ 27 сентября 2010

Возможно, вам придется сделать это, чтобы изменить их доступ на непубличный или контролировать, какой модуль перевода их определяет.

Непубличный

Несмотря на то, что эти функции обычно общедоступны, вы можете пожелать, чтобы они были не общедоступными, хотя по-прежнему требуется реализация по умолчанию:

struct A {
protected:
  ~A();

private:
  A();
  A(A const&);
  A(A&&);
};

// according to N3092, §8.4.2/2, cannot be non-public and defaulted
// in the class definition
A::~A() = default;
A::A() = default;
A::A(A const&) = default;
A::A(A&&) = default;

Этот класс может быть создан по умолчанию, скопирован и перемещен, но только методами и друзьями A. Это полезно для фабрик, где построение может быть более жестким.

Защищенный деструктор - это вторая половина общедоступного виртуального / защищенного не виртуального руководства для базовых классов:

Рекомендация № 4: деструктор базового класса должен быть либо общедоступным и виртуальным, либо защищенным и не виртуальным.

Определение контроля

Кроме того, функции по умолчанию могут использоваться для поддержания стабильного двоичного интерфейса, поскольку вы можете контролировать, где определены функции по умолчанию. Значение по умолчанию не подразумевает inline, как неявно объявленные версии. (В приведенном выше коде функции по умолчанию не должны быть в заголовке или иметь встроенный спецификатор.)

2 голосов
/ 27 сентября 2010

В дополнение к функциональным целям, я нахожу это полезным для ясности.Это ясно дает понять, что структура предназначена для конструирования по умолчанию (или чего-либо еще), и что мы используем поведение, сгенерированное компилятором.Чем лучше самодокументируется ваш код, тем лучше.

...