J'ai Comment serait-il possible de faire le
const fred ** q1 = & p1
via la coulée de pointeur? P> (Je viens de lire que cela pourrait être possible) P> Merci pour vos réponses. Le const_cast fonctionne en effet pour les objets p> donne p> Toutefois, pour des types prédéfinis, il ne fonctionne pas: p > résulte: p> a1 is 1.2
b1 is 0xffbff208
b1 is 0xffbff208
c1 is 0xffbff208
d1 is 0xffbff208
*d1 is 1.2
*d1 is 7.3
*d1 address is 0xffbff208
a1 is 1.2
a1 address is0xffbff208
*d1 is 7.3
*d1 address is 0xffbff208
f1 is 1.200000
6 Réponses :
Vous voulez const_cast code>
. P>
Vous permet de créer un pointeur non-const à un objet Const, mais toute tentative de modification de cet objet Const entraîne toujours un comportement non défini.
Cela devrait le faire:
Foo** f; const Foo** cf = const_cast<const Foo**>(f);
Ce n'est pas une bonne idée, car il viole la sécurité du type. Laissez-moi vous expliquer pourquoi:
Fred* pFred; const Fred** ppFred = const_cast<const Fred**>(&p); *ppFred = new const Fred; // Now pFred points to a const Fred pFred->some_evil_mutating_method(); // can do, since type of *pFred is non-const!
Vous êtes correct à l'écart de ce type de comportement, mais s'il vous plaît ne confondez pas "pas une bonne idée" pour "pas possible". Remplacement de Reterpret_cast avec const_cast dans son code produit parfaitement valide, compilable C ++.
Yup, vient de vérifier la norme. Ma faute - Je n'avais jamais réalisé que const_cast est spécifiquement bien défini pour les chaînes de pointeur, bien qu'elle soit intrinsèquement dangereuse là-bas. Ironique, considérant qu'il est généralement supposé que const_cast code> n'est dangereux que lorsque vous éliminez la consension d'un objet qui est intrinsèquement const-dans ce cas, il est dangereux lorsque vous "ajoutez" const à un objet qui est non-const. Cela ressemble à une décision de design très malodorante pour moi, mais je suppose que c'est C ++ pour vous. Va réparer la réponse.
@Pavel, si vous avez besoin d'un const_cast, vous faites quelque chose de potentiellement dangereux, les cas de sécurité n'ont pas besoin de la distribution. (Notez que dans C, il y a des cas sûrs qui ont besoin d'une distribution).
Ce n'est pas vrai. Par exemple, vous aurez peut-être besoin d'un const_cast code> pour appeler une méthode de surcharge de const ou une méthode de membre Const, lorsque vous obtiendrez autrement une version non constituée. Ceci est parfaitement sûr et même potentiellement potentiellement dangereux.
J'ai l'impression que Pavel comprend ce principe assez bien, il l'exprime juste à l'OP.
Je pense que Apogrammer avait Supprimer i> Const avec const_cast code> à l'esprit. Pour Ajout i> const, vous pouvez utiliser quelque chose d'autre au lieu de la distribution, comme
a const & a = * Ainsi; Ainsi; A.IAT (); code>.
Vous pouvez, bien que je ne vois aucune raison d'introduire un local supplémentaire lorsqu'il y a un casting disponible pour ce but :)
Pourquoi ne faites-vous pas que vous faites:?
const Fred** q1; *q1 = p1;
Vous ne devriez pas avoir besoin de faire de casting pour const Fred ** q1 = & p1 code> en tant que non-const
Fred ** * / code> peut être directement attribué à un
Cons Fred ** Q1 Code> Dans sa déclaration. P>
Nope, ça ne peut pas. Essayez-le pour vous-même - il ne compilera pas sans const_cast code>.
Vous ne devriez pas le faire. Le fait que vous ne puissiez pas facilement faire la conversion est parce qu'il enfreint la correction constante (et votre code l'exerce). En utilisant les recommandations ci-dessus, votre code compilera et appellera une méthode de mutation sur un objet constant (dernière ligne de code). P>
qui n'est pas recommandé et dans certains cas rares pourraient même tuer votre demande (un objet global constant pourrait être stocké dans une page de mémoire en lecture seule), ou laissez-la une situation instable (vous modifiez l'état interne d'un objet par changer à travers une référence constante en élément membre interne, briser les invariants d'objets). P>
À propos de votre problème: C ++ FAQ Lite [18.17 ] p>
Merci pour le reforma! Beaucoup plus facile à lire!
Les nouvelles informations que vous avez ajoutées sont efficacement une question différente. À l'avenir, envisagez de la publier en tant que telle (cela aura plus de réponses aussi). Quant aux optimisations du compilateur pour les primitives de Const: Si vous ne voulez pas que le compilateur l'optimise, euh ... ne le faites pas pour le const. Le point de const est de dire au compilateur que vous ne changerez pas cette valeur. Par conséquent, si vous essayez de la modifier par la suite, vous enfreignez la norme C ++. En d'autres termes, ne le faites pas! Encore une fois, si vous avez l'intention de modifier une valeur, ne faites pas le const. Période.