Указывайте значения элементов перечисления только при необходимости
Причина
Это простейший подход. Он исключает дублирующиеся значения элементов. Значения по умолчанию образуют последовательный набор, удобный для реализации switch-операторов.
Пример
enum class Col1 { red, yellow, blue };
enum class Col2 { red = 1, yellow = 2, blue = 2 }; // опечатка
enum class Month { jan = 1, feb, mar, apr, may, jun,
jul, august, sep, oct, nov, dec }; // начало с 1 — общепринятое соглашение
enum class Base_flag { dec = 1, oct = dec << 1, hex = dec << 2 }; // набор битов
Указание значений необходимо, когда требуется соответствие принятым соглашениям (например, Month) или когда последовательные значения нежелательны (например, для получения отдельных битов, как в Base_flag).
Контроль
- Отмечать дублирующиеся значения элементов перечисления.
- Отмечать явно заданные полностью последовательные значения элементов перечисления.
R: Управление ресурсами
В этом разделе содержатся правила, связанные с ресурсами. Ресурс — это всё, что необходимо получить и (явно или неявно) освободить: память, файловые дескрипторы, сокеты, блокировки и т.д. Причина необходимости освобождения ресурса, как правило, в том, что он присутствует в ограниченном количестве, и даже задержка освобождения может причинить вред. Основная цель — гарантировать, что ресурсы не утекают и не удерживаются дольше, чем нужно. Сущность, отвечающая за освобождение ресурса, называется владельцем.
Существуют случаи, когда утечки допустимы или даже оптимальны: Если программа просто генерирует вывод на основе ввода, а объём необходимой памяти пропорционален размеру ввода, оптимальной стратегией (с точки зрения производительности и простоты программирования) иногда является полный отказ от освобождения памяти. Если памяти достаточно для обработки максимального ввода — пусть утекает, но обязательно выдавайте корректное сообщение об ошибке. Здесь такие случаи не рассматриваются.
- Сводка правил управления ресурсами:
- R.1: Управляйте ресурсами автоматически, используя дескрипторы ресурсов и RAII
- R.2: В интерфейсах используйте сырые указатели только для обозначения отдельных объектов
- R.3: Сырой указатель (
T*) не владеет объектом - R.4: Сырая ссылка (
T&) не владеет объектом - R.5: Предпочитайте объекты с ограниченным временем жизни; без необходимости не выделяйте память в куче
- R.6: Избегайте неконстантных глобальных переменных
- Сводка правил выделения и освобождения памяти:
- R.10: Избегайте
malloc()иfree() - R.11: Избегайте явных вызовов
newиdelete - R.12: Немедленно передавайте результат явного выделения ресурса объекту-менеджеру
- R.13: Выполняйте не более одного явного выделения ресурса в одном выражении-операторе
- [R.14: Избегайте параметров-массивов
[], предпочитайтеspan](/roadmap/cpp/guidelines/r-14) - R.15: Всегда перегружайте согласованные пары выделения/освобождения
- <a name="rr-summary-smartptrs"></a>Сводка правил для умных указателей:
- R.20: Используйте
unique_ptrилиshared_ptrдля выражения владения - R.21: Предпочитайте
unique_ptrвместоshared_ptr, если не нужно разделять владение - R.22: Используйте
make_shared()для созданияshared_ptr - R.23: Используйте
make_unique()для созданияunique_ptr - R.24: Используйте
std::weak_ptrдля разрыва цикловshared_ptr - R.30: Принимайте умные указатели в качестве параметров только для явного выражения семантики времени жизни
- R.31: Если у вас есть умные указатели не из
std, следуйте базовому паттерну изstd - R.32: Принимайте параметр
unique_ptr<widget>для выражения того, что функция принимает владениеwidget - R.33: Принимайте параметр
unique_ptr<widget>&для выражения того, что функция переустанавливаетwidget - R.34: Принимайте параметр
shared_ptr<widget>для выражения разделённого владения - R.35: Принимайте параметр
shared_ptr<widget>&для выражения того, что функция может переустановить общий указатель - R.36: Принимайте параметр
const shared_ptr<widget>&для выражения того, что он может сохранить счётчик ссылок на объект - R.37: Не передавайте указатель или ссылку, полученные из псевдонима умного указателя