8
votes

Comment pointer-couler FOO ** à const foo ** en C ++

J'ai xxx pré>

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> xxx pré>

donne p> xxx pré>

Toutefois, pour des types prédéfinis, il ne fonctionne pas: p > xxx pré>

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 


2 commentaires

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.


6 Réponses :


3
votes

Vous voulez const_cast .


1 commentaires

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.



17
votes

Cela devrait le faire:

Foo** f;
const Foo** cf = const_cast<const Foo**>(f);


0 commentaires

10
votes

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!


7 commentaires

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 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 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 Const avec const_cast à l'esprit. Pour Ajout const, vous pouvez utiliser quelque chose d'autre au lieu de la distribution, comme a const & a = * Ainsi; Ainsi; A.IAT (); .


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 :)



1
votes

Pourquoi ne faites-vous pas que vous faites:?

const Fred** q1;
*q1 = p1;


0 commentaires

-1
votes

Vous ne devriez pas avoir besoin de faire de casting pour const Fred ** q1 = & p1 en tant que non-const Fred ** * / code> peut être directement attribué à un Cons Fred ** Q1 Dans sa déclaration.


1 commentaires

Nope, ça ne peut pas. Essayez-le pour vous-même - il ne compilera pas sans const_cast .



0
votes

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).

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).

À propos de votre problème: C ++ FAQ Lite [18.17 ]


0 commentaires