Avviso C26473
Non eseguire il cast tra i tipi di puntatore in cui il tipo di origine e il tipo di destinazione sono uguali.
Linee guida di base di C++: Type.1: Evitare i cast
Questa regola consente di rimuovere cast non necessari o sospetti. Ovviamente, quando un tipo viene convertito in se stesso, tale conversione è inefficace. Tuttavia, il fatto che il cast viene usato può indicare un problema di progettazione sottile o un potenziale di regressione se i tipi cambiano in futuro. È sempre più sicuro usare il minor numero possibile di cast.
Osservazioni:
- Questa regola viene implementata per cast statici e cast reinterpretati e controlla solo i tipi di puntatore.
Esempio
ricerca pericolosamente generica
gsl::span<server> servers_;
template<class T>
server* resolve_server(T tag) noexcept {
auto p = reinterpret_cast<server*>(tag); // C26473, also 26490 NO_REINTERPRET_CAST
return p >= &(*servers_.begin()) && p < &(*servers_.end()) ? p : nullptr;
}
void promote(server *s, int index) noexcept {
auto s0 = resolve_server(s);
auto s1 = resolve_server(index);
if (s0 && s1)
std::swap(s0, s1);
}
ricerca pericolosamente generica - rielaborato
// ...
server* resolve_server(server *p) noexcept {
return p >= &(*servers_.begin()) && p < &(*servers_.end()) ? p : nullptr;
}
server* resolve_server(ptrdiff_t i) noexcept {
return !servers_.empty() && i >= 0 && i < servers_.size() ? &servers_[i] : nullptr;
}
// ...