共用方式為


警告 C26474

當轉換可能隱含時,請勿在指標類型之間轉換。

C++ 核心指導方針
Type.1 :避免轉換

在某些情況下,指標類型之間的隱含轉換是安全的,而且不需要您撰寫特定的轉換運算式。 此規則會尋找您可以安全地移除之不必要轉換的實例。

備註

規則識別碼應解譯為「無法接受的隱含轉換」。

此規則僅適用于指標。 它會檢查靜態轉換和重新解譯轉換。

這些情況是不應該使用明確轉換運算式的可接受指標轉換:

  • nullptr_t轉換為 ;
  • void*轉換為 ;
  • 在叫用衍生型別未隱藏的基底成員函式時,從衍生型別轉換成其基底。

範例 1

此範例中不必要的轉換會隱藏邏輯錯誤:

template<class T>
bool register_buffer(T buffer) {
    auto p = reinterpret_cast<void*>(buffer); // C26474, also 26490 NO_REINTERPRET_CAST
    // To fix, declare buffer as T*, and use this to define p:
    // auto p = buffer;
    return buffers_.insert(p).second;
}

void merge_bytes(std::uint8_t *left, std::uint8_t *right)
{
    if (left && register_buffer(*left)) { // Unintended dereference!
        // ...
        if (right && register_buffer(right)) {
            // ...
        }
    }
}

範例 2

此範例示範如何使用轉換來存取基類成員函式:

struct struct_1
{
    void foo();
    void bar();
};

struct struct_2 : struct_1
{
    void foo(); // this definition hides struct_1::foo
};

void fn(struct_2* ps2)
{
    static_cast<struct_1*>(ps2)->foo(); // This cast is necessary to access struct_1::foo
                                        // Alternatively, use ps2->struct_1::foo();
    static_cast<struct_1*>(ps2)->bar(); // This cast is unnecessary and can be done implicitly
}