В интерфейсах используйте сырые указатели только для обозначения отдельных объектов
Причина
Массивы распадаются в указатель, теряя информацию о размере и открывая возможность для ошибок выхода за границы. Используйте span для сохранения информации о размере.
Пример (плохой)
void f(int* p, int n) // n — количество элементов в p[]
{
// ...
p[2] = 7; // плохо: индексирование сырого указателя
// ...
}
Компилятор не читает комментарии, и без изучения остального кода нельзя понять, действительно ли p указывает на n элементов. Используйте span.
Пример
void g(int* p, int fmt) // вывести *p в формате #fmt
{
// ... использует только *p и p[0] ...
}
Исключение
C-строки передаются как одиночный указатель на нуль-терминированную последовательность символов. Используйте zstring вместо char*, чтобы показать, что вы полагаетесь на это соглашение.
Примечание
Многие текущие применения указателей на один элемент могут быть заменены ссылками. Однако там, где nullptr является допустимым значением, ссылка может оказаться неподходящей альтернативой.
Контроль
Это правило может генерировать большое число ложных срабатываний в старых кодовых базах.
- Отмечать арифметику с указателями (включая
++) для указателя, не являющегося частью контейнера, представления или итератора. - Отмечать передачу имён массивов как обычных указателей.