Avviso C26445
Non assegnare
gsl::span
ostd::string_view
a un riferimento. Sono economici da costruire e non sono proprietari dei dati sottostanti. (gsl.view)
Un riferimento a gsl::span
o std::string_view
può essere un'indicazione di un problema di durata.
Linee guida di base di C++
Questa regola rileva problemi di durata sottili che possono verificarsi nel codice migrato da contenitori standard a nuovi tipi di intervallo e visualizzazione. Tali tipi possono essere considerati "riferimenti ai buffer". L'uso di un riferimento a un intervallo o a una vista crea un livello aggiuntivo di riferimento indiretto. Tale riferimento indiretto spesso non è necessario e può generare confusione per i gestori. Gli intervalli sono economici da copiare e possono essere restituiti dal valore dalle chiamate di funzione. Ovviamente, tali risultati di chiamata non dovrebbero mai essere referenziati.
Osservazioni:
- La regola rileva i riferimenti a gsl::span<>, gsl::basic_string_span<> e std::basic_string_view<> (inclusi gli alias per le istanze).
- Attualmente gli avvisi vengono generati solo sulle dichiarazioni e sulle istruzioni return. Questa regola potrebbe essere estesa in futuro anche ai parametri della funzione di flag.
- L'implementazione di questa regola è lightweight non tenta di tracciare le durate effettive. L'uso di riferimenti può comunque avere senso in alcuni scenari. In questi casi, i falsi positivi possono essere eliminati in modo sicuro.
Nome dell'analisi del codice: NO_SPAN_REF
Esempio
Riferimento a un oggetto temporaneo:
// 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.