警告 C26474

当强制转换可为隐式时,请勿在指针类型间强制转换。

C++ Core Guidelines:
Type.1:避免强制转换

在某些情况下,指针类型之间的隐式强制转换是安全的,你不需要编写特定的强制转换表达式。 此规则查找你可以安全移除的不必要强制转换的实例。

备注

规则 ID 应解释为“在可接受的情况下不使用隐式强制转换”。

此规则仅适用于指针。 此规则将检查静态转换并重新解释转换。

这些情况是可接受的指针转换,不应使用显式强制转换表达式:

  • 转换为 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
}