Возможно, вам придется сделать это, чтобы изменить их доступ на непубличный или контролировать, какой модуль перевода их определяет.
Непубличный
Несмотря на то, что эти функции обычно общедоступны, вы можете пожелать, чтобы они были не общедоступными, хотя по-прежнему требуется реализация по умолчанию:
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, как неявно объявленные версии. (В приведенном выше коде функции по умолчанию не должны быть в заголовке или иметь встроенный спецификатор.)