Compartir a través de


Advertencia C26445

No asigne gsl::span ni std::string_view a una referencia. Son baratos para construir y no son propietarios de los datos subyacentes. (gsl.view)

Una referencia a gsl::span o std::string_view puede indicar un problema de duración.

C++ Core Guidelines

GSL.view: Views

Esta regla detecta problemas sutiles de duración que pueden producirse en el código migrado de contenedores estándar a nuevos tipos de intervalo y vista. Estos tipos se pueden considerar como "referencias a búferes". El uso de una referencia a un intervalo o vista crea una capa adicional de direccionamiento indirecto. Este direccionamiento indirecto suele ser innecesario y puede resultar confuso para los mantenedores. Los intervalos son baratos de copiar y se pueden devolver por valor desde las llamadas de función. Obviamente, nunca se debe hacer referencia a estos resultados de llamada.

Comentarios

  • La regla detecta referencias a gsl::span<>, gsl::basic_string_span<> y std::basic_string_view<> (incluidos alias a la creación de instancias).
  • Actualmente, solo se emiten advertencias en declaraciones e instrucciones "return". Esta regla se puede extender en el futuro para marcar también los parámetros de función.
  • La implementación de esta regla es ligera, no intenta realizar un seguimiento de las duraciones reales. El uso de referencias puede tener sentido en algunos escenarios. En tales casos, se pueden suprimir los falsos positivos de forma segura.

Nombre del análisis de código: NO_SPAN_REF

Ejemplo

Referencia a una temporal:

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