Ответ 1
Идиомы, такие как частный деструктор, обычно используются, чтобы другие программисты не выполняли определенные операции с вашим типом. Частный деструктор, в частности, предотвращает следующее:
- Объявление типа вашего экземпляра в стеке
- Ручное удаление экземпляра вашего типа с помощью ключевого слова delete
- Ручные деструкторные вызовы
Выполнение любого из них вызовет ошибку компиляции, которая не является тривиальной для работы. Обычно сообщение представляет собой сообщение от автора пользователю о том, что они не должны выполнять одну или все из этих операций, вместо этого автор может захотеть, чтобы они:
- Вызвать factory функции для уничтожения экземпляров этого типа (обычно в сочетании с частными конструкторами). Предоставление дополнительного контекста для строительства и уничтожения может обеспечить возможности оптимизации или предотвратить неправильное использование API, когда пакетная операция намного эффективнее, чем выделение "один".
- Не выделяйте какие-либо экземпляры этого типа (возможно, это singleton)
Рассмотрите возможность записи типа, который управляет аппаратным интерфейсом, позволяя пользователю просто удалять экземпляр, который может оставить аппаратное обеспечение в нежелательном состоянии - так почему же это разрешить? Да, в какой-то момент API можно сконструировать, чтобы отвлечься от этой трудности, но на каком-то базовом уровне нужно "разоблачить" функциональность.
= delete - это "новый" пуленепробиваемый способ предотвращения ошибки пользователя. В отличие от частного конструктора копирования его нельзя обойти по ключевому слову "friend". Он также имеет тенденцию читать лучше, поскольку он постоянно информирует пользователя о коде, что эта функция недоступна. Мое понимание заключается в том, что = delete было введено в С++ 11 в качестве замены "no copy/no delete idioms".