Aviso C26445

Não atribuir 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.view)

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

Diretrizes Principais do C++

GSL.view: Views

Essa regra captura problemas sutis de tempo de vida que podem ocorrer no código migrado de contêineres padrão para novos tipos de intervalo e exibição. Tais 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 indirecionamento. Essa indireção geralmente é desnecessária e pode ser confusa para os responsáveis pela manutenção. Os intervalos são baratos de copiar e podem ser retornados por valor por meio de chamadas de função. Obviamente, esses resultados de chamada nunca devem ser referenciados.

Comentários

  • A regra detecta referências a gsl::span<>, gsl::basic_string_span<> e std::basic_string_view<> (incluindo aliases a instanciações).
  • Atualmente, os avisos são emitidos apenas em declarações e instruções return. Essa regra pode ser estendida no futuro para também sinalizar parâmetros de função.
  • A implementação dessa regra é leve e não tenta rastrear o tempo de vida real. O uso de referências ainda pode fazer sentido em alguns cenários. Nesses casos, 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.