Предупреждение C26445
Не назначайте ссылку или
std::string_view
не назначайтеgsl::span
ссылку. Они дешевы для создания и не являются владельцами базовых данных. (gsl.view)
Ссылка на gsl::span
или std::string_view
может быть признаком проблемы со временем существования.
C++ Core Guidelines
Это правило перехватывает тонкие проблемы со временем существования, которые могут возникать в коде, перенесенном из стандартных контейнеров в новые диапазоны и типы представлений. Такие типы можно рассматривать как "ссылки на буферы". Использование ссылки на диапазон или представление создает дополнительный слой косвенного обращения. Такая косвенность часто является ненужным и может быть запутана для обслуживающих. Диапазоны дешевы для копирования и могут быть возвращены по значению из вызовов функций. Очевидно, что такие результаты вызова никогда не должны ссылаться.
Замечания
- Правило обнаруживает ссылки на gsl::span<>, gsl::basic_string_span и std::basic_string_view<><> (включая псевдонимы в экземпляры).
- В настоящее время предупреждения создаются только для объявлений и операторов возврата. Это правило может быть расширено в будущем, чтобы также пометить параметры функции.
- Реализация этого правила является упрощенной, не пытается отслеживать фактическое время существования. Использование ссылок по-прежнему имеет смысл в некоторых сценариях. В таких случаях ложные срабатывания можно безопасно подавлять.
Имя анализа кода: NO_SPAN_REF
Пример
Ссылка на временное:
// Old API - uses string reference to avoid data copy.
const std::string& get_working_directory() noexcept;
// New API - after migration to C++17 it uses string view.
std::string_view get_working_directory() noexcept;
// ...
// Client code which places an explicit reference in a declaration with auto specifier.
const auto &wd = get_working_directory(); // C26445 after API update.