Aviso C26445
Não atribuir
gsl::span
oustd::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++
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.