Partilhar via


Aviso C26445

Não atribua gsl::span ou std::string_view a uma referência. Eles são baratos de construir e não são proprietários dos dados subjacentes. (gsl.vista)

Uma referência a gsl::span ou std::string_view pode ser uma indicação de um problema vitalício.

Diretrizes principais do C++

GSL.view: Visualizações

Esta regra deteta problemas sutis de tempo de vida que podem ocorrer no código migrado de contêineres padrão para novos tipos de extensão e exibição. Esses tipos podem ser considerados como "referências a buffers". O uso de uma referência a uma extensão ou exibição cria uma camada extra de indireção. Essa indireção é muitas vezes desnecessária e pode ser confusa para os mantenedores. Os Spans são baratos de copiar e podem ser retornados pelo valor de chamadas de função. Obviamente, tais resultados de chamada nunca devem ser referenciados.

Observações

  • A regra deteta referências a gsl::span<>, gsl::basic_string_span<> e std::basic_string_view<> (incluindo aliases para instanciações).
  • Atualmente, os avisos são emitidos apenas em declarações e declarações de retorno. Esta regra pode ser estendida no futuro para também sinalizar parâmetros de função.
  • A implementação desta regra é leve não tenta rastrear vidas reais. O uso de referências ainda pode fazer sentido em alguns cenários. Nesses casos, os falsos positivos podem ser suprimidos com segurança.

Nome da análise de código: NO_SPAN_REF

Exemplo

Referência a um temporário:

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