警告 C26473

当源类型与目标类型相同时,请勿在指针类型间强制转换。

C++ Core GuidelinesType.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;
}
// ...