Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Ne váltsa át a mutatótípusokat, ha az átalakítás implicit lehet.
C++ alapvető irányelvek:
Type.1: Kihagyások elkerülése
Bizonyos esetekben az implicit átalakítások a mutatótípusok között biztonságosak, és nem követelik meg, hogy egy adott típusátalakító kifejezést írnia. Ez a szabály megkeresi a felesleges, biztonságosan eltávolítható konverziókat.
Megjegyzések
A szabályazonosítót úgy kell értelmezni, hogy "Az implicit átalakítás nem kerül alkalmazásra ott, ahol elfogadható lenne."
Ez a szabály csak a mutatókra vonatkozik. Ellenőrzi a statikus kasztokat és reinterpretálja a kasztokat.
Ezek az esetek elfogadható mutatókonverziók, amelyek nem használhatnak explicit öntött kifejezéseket:
- átalakítás
nullptr_t-ra - átalakítás
void*; - a származtatott típusból a bázisra konvertálás olyan alaptagfüggvény meghívásakor, amelyet nem rejt el a származtatott típus.
1. példa
A szükségtelen átalakítás elrejt egy logikai hibát ebben a példában:
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. példa
Ez a példa bemutatja, hogy az alaposztály tagfüggvényeihez a castek használatával férhet hozzá:
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
}