Я знаю, что могу объявить деструктором =delete
или же private
чтобы программа неявно удалила объект в конце области видимости. Я также знаю, что если это приватно, у меня может быть функция-член, которая может явно вызывать деструктор всякий раз, когда я вызываю его: void kill() { this–>~A(); }
Мои вопросы:
Почему я хотел бы предотвратить неявное уничтожение? Пожалуйста, приведите пример
Что бы =delete
делать? Это гарантирует, что деструктор никогда не запускается? Значит, объект будет существовать вечно за пределами его возможностей?
Идиомы, такие как закрытый деструктор, обычно используются для предотвращения выполнения другими операциями определенных программ с вашим типом. Частный деструктор, в частности, предотвращает следующее:
Выполнение любого из них вызовет ошибку компиляции, которая не является тривиальной для обхода. Ошибка обычно является сообщением от автора пользователю, что он не должен выполнять одну или все из этих операций, вместо этого автор может пожелать, чтобы они:
Подумайте над тем, чтобы написать тип, который управляет аппаратным интерфейсом, позволяя пользователю просто удалить экземпляр, что может привести к нежелательному состоянию оборудования — так зачем вообще это разрешать? Да, в какой-то момент API может быть создан, чтобы абстрагироваться от этой трудности, но на каком-то базовом уровне необходимо раскрыть «хрупкую» функциональность.
= delete — это «новый» пуленепробиваемый способ предотвращения ошибок пользователя. В отличие от конструктора личных копий, его нельзя обойти с помощью ключевого слова friend. Он также имеет тенденцию к лучшему чтению, поскольку он последовательно сообщает пользователю кода, что эта функция недоступна. Насколько я понимаю, = удаление было введено в c ++ 11 в качестве замены «идиомы без копирования / без удаления».
Других решений пока нет …