const_cast est un opérateur de conversion spécial en C++ qui permet de supprimer ou d'ajouter le qualificateur const/volatile aux pointeurs ou aux références. Il est le plus souvent utilisé pour passer un objet à une fonction qui attend un type non constant, lorsque l'objet d'origine a été défini avec le modificateur const.
Utilisation :
const T& global), tenter d'écrire en levant l'indicateur const mène à un comportement indéfini.void foo(int* p) { *p = 42; } void bar(const int* q) { // Retirer const — UNIQUEMENT si l'objet d'origine n'est pas const ! foo(const_cast<int*>(q)); }
Si un pointeur sur int est passé à bar, il est possible de retirer const en toute sécurité. Si c'est un const int, cela entraînera un UB lors de l'écriture.
mutable."Peut-on utiliser const_cast pour supprimer const d'un objet qui est un littéral ou qui se trouve dans une section mémoire en lecture seule ? Qu'est-ce que cela implique ?"
Réponse : On peut enlever la propriété const d'un pointeur ou d'une référence, mais si l'on tente de modifier un littéral ou une valeur située dans une section "read-only" (par exemple, des littéraux de chaîne, des const statiques), cela entraînera un comportement indéfini — cela peut mener à un crash ou à l'ignorance de l'écriture.
Exemple :
const char* str = "hello"; char* p = const_cast<char*>(str); p[0] = 'H'; // UB : littéral de chaîne dans une mémoire en lecture seule !
Histoire
Dans le projet, nous avons retiré const des champs, puis avons écrit dans ces champs, sans réaliser que la valeur passée était réellement const (une constante globale), ce qui a provoqué des plantages de l'application avec des segmentation faults sur certaines plateformes.
Histoire
Dans le code, const_cast était utilisé pour contourner des méthodes const sans qualificateur mutable : à l'intérieur de la méthode const, les champs de la classe étaient modifiés, ce qui conduisait à des bugs difficiles à détecter lors d'accès concurrents.
Histoire
const_cast incorrect sur des objets de conteneurs STL (par exemple, const std::vector), après quoi le conteneur était modifié — cela ne provoque pas toujours une erreur immédiatement, mais entraîne un comportement imprévisible lors de futures opérations sur le conteneur.