Korzystanie obsady statycznego prawdopodobnie spowodować coś takiego:
// This does not prevent a possible type overflow
const char char_max = -1;
int i = 48;
char c = (i & char_max);
Aby zapobiec ewentualnemu typu przepełnienie można to zrobić:
const char char_max = (char)(((unsigned char) char(-1))/2);
int i = 128;
char c = (i & char_max); // Would always result in positive signed values.
Gdzie reinterpret_cast prawdopodobnie tylko bezpośrednio przekształcić do char , bez żadnego zabezpieczenia odlanego. -> Nigdy nie używaj reinterpret_cast, jeśli możesz również użyć static_cast. Jeśli przesyłasz między klasami, static_cast zapewnia również, że oba typy są zgodne (obiekt jest pochodną typu rzutowania).
Jeśli twój obiekt jest polimorficzny i nie wiesz, który to jest, powinieneś użyć dynamic_cast, który wykona test typu w czasie wykonywania i zwróci nullptr, jeśli typy nie są zgodne.
JEŚLI potrzebujesz const_cast, najprawdopodobniej zrobiłeś coś nie tak i powinieneś pomyśleć o możliwych alternatywach, aby naprawić poprawność stałej w swoim kodzie.
Możesz również zrobić "char c = i;" i nie martw się o to, który rzut jest, który. Oczywiście, jeśli to zrobisz, spotkasz ludzi "rzucających wszędzie", którzy upierają się, że ostrzeżenia kompilatora zmieniają się w błędy, a następnie naprawiane tam, gdzie występują. –