Upozornění C26445
Nepřiřazujte ani
std::string_view
nepřiřazujtegsl::span
odkaz. Jsou levné k vytvoření a nejsou vlastníky podkladových dat. (gsl.view)
Odkaz na gsl::span
nebo std::string_view
může být indikací problému životnosti.
C++ Core Guidelines
Toto pravidlo zachytává drobné problémy s životností, ke kterým může dojít v kódu migrovaném ze standardních kontejnerů na nové typy rozsahů a zobrazení. Takové typy lze považovat za "odkazy na vyrovnávací paměť". Použití odkazu na rozsah nebo zobrazení vytvoří další vrstvu nepřímých odkazů. Takové nepřímé je často zbytečné a může být matoucí pro správce. Rozsahy jsou levné ke kopírování a mohou být vráceny hodnotou z volání funkce. Samozřejmě, takové výsledky volání by nikdy neměly být odkazovány.
Poznámky
- Pravidlo detekuje odkazy na gsl::span<>, gsl::basic_string_span<> a std::basic_string_view<> (včetně aliasů pro vytváření instancí).
- V současné době se upozornění vygenerují pouze u deklarací a návratových příkazů. Toto pravidlo se může v budoucnu rozšířit tak, aby také označí parametry funkce.
- Implementace tohoto pravidla je jednoduchá, nepokouší se sledovat skutečné životnosti. Použití odkazů může v některých scénářích stále dávat smysl. V takových případech lze falešně pozitivní výsledky bezpečně potlačit.
Název analýzy kódu: NO_SPAN_REF
Příklad
Odkaz na dočasný:
// 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.