Поделиться через


Предупреждение C26445

Не назначайте ссылку или std::string_view не назначайте gsl::span ссылку. Они дешевы для создания и не являются владельцами базовых данных. (gsl.view)

Ссылка на gsl::span или std::string_view может быть признаком проблемы со временем существования.

C++ Core Guidelines

GSL.view: Представления

Это правило перехватывает тонкие проблемы со временем существования, которые могут возникать в коде, перенесенном из стандартных контейнеров в новые диапазоны и типы представлений. Такие типы можно рассматривать как "ссылки на буферы". Использование ссылки на диапазон или представление создает дополнительный слой косвенного обращения. Такая косвенность часто является ненужным и может быть запутана для обслуживающих. Диапазоны дешевы для копирования и могут быть возвращены по значению из вызовов функций. Очевидно, что такие результаты вызова никогда не должны ссылаться.

Замечания

  • Правило обнаруживает ссылки на 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.