Warnung C26445
Weisen Sie
gsl::span
keinen Verweis zu oderstd::string_view
weisen Sie diesen zu. Sie sind billig zu konstruieren und sind keine Besitzer der zugrunde liegenden Daten. (gsl.view)
Ein Verweis auf gsl::span
oder std::string_view
kann ein Hinweis auf ein Lebenszeitproblem sein.
C++ Core Guidelines
Diese Regel erfasst subtile Lebensdauerprobleme, die im Code auftreten können, der von Standardcontainern zu neuen Span- und Ansichtstypen migriert wird. Solche Typen können als "Verweise auf Puffer" betrachtet werden. Die Verwendung eines Verweises auf eine Spanne oder Ansicht erstellt eine zusätzliche Dereferenzierungsebene. Diese Dereferenzierung ist oft unnötig und kann für Standard Tainer verwirrend sein. Spans sind billig zu kopieren und können von Funktionsaufrufen zurückgegeben werden. Offensichtlich sollten solche Anrufergebnisse niemals referenziert werden.
Hinweise
- Die Regel erkennt Verweise auf gsl::span<>, gsl::basic_string_span<> und std::basic_string_view<> (einschließlich Aliase zu Instanziierungen).
- Derzeit werden Warnungen nur für Deklarationen und Rückgabeanweisungen ausgegeben. Diese Regel kann in Zukunft erweitert werden, um auch Funktionsparameter zu kennzeichnen.
- Die Implementierung dieser Regel ist einfach und versucht nicht, die tatsächlichen Lebensdauern nachzuverfolgen. Die Verwendung von Verweisen kann in einigen Szenarien weiterhin sinnvoll sein. In solchen Fällen können falsch positive Ergebnisse sicher unterdrückt werden.
Codeanalysename: NO_SPAN_REF
Beispiel
Verweis auf eine temporäre:
// 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.