Avertissement C26445

N’affectez gsl::span pas ou std::string_view à une référence. Ils sont bon marché pour construire et ne sont pas propriétaires des données sous-jacentes. (gsl.view)

Une référence à gsl::span ou std::string_view peut être une indication d’un problème de durée de vie.

C++ Core Guidelines

GSL.view : Vues

Cette règle intercepte les problèmes de durée de vie subtils qui peuvent se produire dans le code migré de conteneurs standard vers de nouveaux types d’étendue et d’affichage. Ces types peuvent être considérés comme des « références à des mémoires tampons ». L’utilisation d’une référence à une étendue ou à une vue crée une couche supplémentaire d’indirection. Cette indirection est souvent inutile et peut être déroutante pour les maintenances. Les étendues sont bon marché pour copier et peuvent être retournées par valeur à partir des appels de fonction. Évidemment, ces résultats d’appel ne doivent jamais être référencés.

Notes

  • La règle détecte les références à gsl ::span<>, gsl ::basic_string_span<> et std ::basic_string_view<> (y compris les alias aux instanciations).
  • Actuellement, les avertissements sont émis uniquement sur les déclarations et les instructions de retour. Cette règle peut être étendue ultérieurement aux paramètres de fonction d’indicateur.
  • L’implémentation de cette règle est légère ne tente pas de tracer les durées de vie réelles. L’utilisation de références peut toujours être logique dans certains scénarios. Dans ce cas, les faux positifs peuvent être supprimés en toute sécurité.

Nom de l’analyse du code : NO_SPAN_REF

Exemple

Référence à un point temporaire :

// 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.