分享方式:


警告 C26473

請勿在來源類型和目標型別相同的指標類型之間轉換。

C++ 核心指導方針 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;
}
// ...