警告 C26473
変換元の型と変換先の型が同じ場合、ポインター型間ではキャストしないでください。
C++ Core Guidelines: Type.1: キャストの回避
このルールは、不必要または不審なキャストを排除するのに役立ちます。 明らかに、型がそれ自体に変換されるとき、そのような変換は効果がありません。 ただし、キャストが使用されるという事実は、設計上の微妙な問題や、将来型が変更された場合の回帰の可能性を示している可能性があります。 できるだけ少ないキャストを使用する方が常に安全です。
解説
- この規則は、静的キャストと再解釈キャストに対して実装され、ポインター型のみをチェックします。
例
危険なジェネリック ルックアップ
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);
}
危険なジェネリック ルックアップ - 修正済み
// ...
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;
}
// ...