À QUOI ÇA SERT ?
Une conversion change la manière dont une valeur ou une adresse est vue par le système de types.
C++ préfère des casts spécialisés plutôt qu’un cast C générique.
1. static_cast
Conversions ordinaires connues du compilateur.
Code: Select all
double d{3.14};
int x = static_cast<int>(d);
"Je sais que je perds la partie décimale."
2. reinterpret_cast
Pour des conversions de représentation bas niveau.
Exemple :
Code: Select all
std::uintptr_t address =
reinterpret_cast<std::uintptr_t>(ptr);
3. const_cast
Permet d’ajouter ou retirer const.
Code: Select all
const int* p = &value;
int* writable = const_cast<int*>(p);
4. QUAND C’EST DANGEREUX
Code: Select all
const int x{42};
int* p = const_cast<int*>(&x);
*p = 10;
Modifier sa mémoire par ce chemin donne un comportement indéfini.
5. CAS POSSIBLE
Code: Select all
int x{42};
const int* p{&x};
Il est seulement vu comme const à travers p.
Retirer const puis modifier x peut être valide :
Code: Select all
int* writable = const_cast<int*>(p);
*writable = 10;
6. POURQUOI const_cast EXISTE
Principalement pour :
- interopérabilité avec du vieux code ;
- API historiques mal déclarées ;
- certains cas génériques avancés.
À RETENIR
Un cast explicite dit :
"Je demande volontairement au compilateur une conversion."
En bas niveau, cela peut être nécessaire, mais chaque cast doit avoir une raison précise.
