Partager via


Avertissement C26473

N’effectuez pas de cast entre les types de pointeurs où le type source et le type cible sont identiques.

Instructions principales C++ : Type.1 : Éviter les casts

Cette règle permet de supprimer des casts inutiles ou suspects. Évidemment, lorsqu’un type est converti en lui-même, une telle conversion est inefficace. Pourtant, le fait que le cast est utilisé peut indiquer un problème de conception subtil ou un potentiel de régression si les types changent à l’avenir. Il est toujours plus sûr d’utiliser autant de casts que possible.

Notes

  • Cette règle est implémentée pour les casts statiques et les casts réinterprets, et vérifie uniquement les types de pointeurs.

Exemple

recherche dangereusement générique

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);
}

recherche dangereusement générique - retravaillée

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