Есть ли «рекомендуемый» набор исключений, которые я могу сделать во всем мире для повышения безопасности типа, например, предотвращение подписывания без знака в выражениях?
Нет. Вы, конечно же, не можете предотвратить целые преобразования, удалив что-либо.
Должен ли я по умолчанию удалять все 5 операций, которые можно удалить во всех моих классах?
Нет! Удаленный деструктор сделает невозможным уничтожить что угодно!
Кроме того, имеет смысл удалить конструктор перемещения rarely. Если ваш тип может быть перемещен дешево, а затем позволяет перемещать (например, при возврате объектов по значению или передавать временные значения по значению в качестве аргументов функции), это обычно хорошо, даже если вы не хотите разрешать копии. Искусственное ограничение пользователей типа от его перемещения при этом является эффективным, просто раздражает и не дает никаких преимуществ.
Вы, кажется, попадаете в ловушку, видя, что функция доступна, и думайте, что вы должны ее использовать. Следующая цитата из The Old Man and the C кажется уместным:
Один последний анекдот о ранее историю , где кто-то использовал INT ссылочный параметр. В , обсуждая эту статью, комментарий программиста был - «Ну, функция была на языке, поэтому я решил, что я должен использовать ее». Мы считаем, что это не достаточные критерии для использования функции C++. Функцию следует использовать только тогда, когда можно продемонстрировать, что она является . Гора поднимается «потому что она есть». То же самое не должно выполняться для функций C++. Их простое существование не является оправданием для использования.
Что касается окончательного вопроса:
Я потенциально может удалить конструктор копирования и добавить отдельный метод, который копирует объект для редкого времени, что я делаю, нужна копия. Будет ли это хорошей идеей?
... возможно ... это может быть случай, когда удаленный конструктор копирования может быть продемонстрирована на пользу. Но я бы сказал, что вообще нет, не делайте этого, потому что это затрудняет хранение объекта в контейнерах, например. Лучше всего просто писать свой код, чтобы избежать нежелательных копий. Если вы не сделали этого и продемонстрировали, что действительно делаете случайные копии, возможно, передумайте удаление конструктора копирования.
Но вы не должны удалять операции «по умолчанию» только потому, что узнали об этой функции. Это должно быть более распространено для использования = default
, а не для = delete
, за исключением классов, которые моделируют некоторые атипичные поведения, такие как уникальное право собственности на ресурс.
Это действительно зависит от ваших прецедентов. Вы хотите запретить копирование? Затем пометьте экземпляр-конструктор (и оператор присваивания копии) как удаленный. Не делайте этого по обычной общей основе, делайте это только при необходимости, это мое личное мнение *. –
Вы уверены, что копируете, если проблема с производительностью? Такое мышление часто приводит к менее эффективному коду. – juanchopanza
Что вы подразумеваете под исключениями, которые вы хотите сделать «глобально»? –