警告 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
}