7
votes

Constons référence à un pointeur ne se comportant pas comme prévu

Pourquoi est-ce que je reçois une erreur quand je cours ça? Je m'attendais à ce que PTR_Ref ne soit pas en mesure de modifier l'adresse dans laquelle le PTR souligne, mais que les choses ne semblent pas aller comme prévu. xxx

merci d'avance, 15 ans NOOB C ++ NOOB


1 commentaires

Pas clair de votre texte, mais avez-vous voulu dire que ptr_ref ne doit pas être capable de modifier ptr ou ne pas être en mesure de modifier B ?


3 Réponses :


12
votes

pTR_Ref code> est déclaré non comme un Const code> référence au pointeur sur int code>, mais plutôt une référence au pointeur sur const int , vous avez donc une inadéquation de type. Vous devriez faire

int* const& ptr_ref = ptr;


6 commentaires

Merci beaucoup oui, je comprends très bien que le mot-clé 'const' fait partie du type en C ++ mais l'homme Ces déclarations de type peuvent être très gênantes, merci beaucoup monsieur.


Il a déclaré qu'il voulait que l'int d'être const . Cela lui permettrait d'être mutable, tout simplement pas le pointeur lui-même.


@WilliamkAppler La question dit "S'attendre à ... être incapable de modifier l'adresse ", que j'ai interprété comme voulant que le pointeur soit constitué.


Il n'y a pas une telle chose qu'une "référence constante". Le problème est une référence ne peut pas se lier à des types non liés, c'est-à-dire "const int *" et "int * '.


Permettez-moi de le reformuler, je veux que pTR_Ref ne puisse pas modifier PTR.


personne n'a déjà mentionné cela, mais si B est censé être non modifiable, alors const int * const & pTR_ref = pTR; peut être utilisé



-3
votes

Une référence est intrinsèquement const, donc il n'y a pas vraiment de point dans la définition comme int * & const pTR_ref = pTR Lorsque vous parlez d'une référence de const, cela signifie normalement une référence à un const, qui est la définition que vous avez utilisée dans votre question.

[modifier] édité ma réponse car j'avais placé le const par erreur du mauvais côté de l'ampersand - C ++ ne vous pardonne pas [/ modifier]


5 commentaires

Eh bien, Si vous avez une référence non Const à un pointeur, la référence est en mesure de modifier la valeur dans laquelle le pointeur pointe vers ce que j'essayais de faire est de restreindre la référence de la possibilité de le faire.


int * const & pTR_ref est une référence à un pointeur de const à int (et il y en a certainement un point à celui-ci). Le const s'applique au pointeur et non à la référence. Pour postuler à la référence, ce serait int * & const , qui n'est pas la syntaxe légale (probablement parce qu'elle est redondante, car, comme vous l'avez dit, une référence est intrinsèquement constituée).


@Benjaminlindley. int * & Cons n'est pas la syntaxe légale car l'identificateur de const ne peut pas être appliqué à une référence (et le compilateur vous le dira). Différent aspect est int * const & ce qui signifie une référence à un pointeur de const à la non-const int, qui est légal, et c'est ce que l'OP demande. J'ai reçu un bowvote sur ma réponse probablement parce qu'ils ne le comprenaient pas clairement (ou je ne l'ai pas expliqué correctement)


@ Ad3angel1s: Pourquoi me dis-tu exactement ce que je viens de vous dire? Et le bowvote n'était pas probable parce que quelqu'un ne l'a pas compris, mais parce que c'était faux. Maintenant, vous l'avez corrigé, mais étant donné la correction, je ne suis pas sûr de ce que c'est une réponse à, car ni l'OP ni personne n'a essayé de déclarer quoi que ce soit int * & const .


1. Une référence n'est pas intrinsèquement const, 2. int * & const pTR_ref est illégal ( const ne peut pas y figurer là) - Je ne sais pas pourquoi vous avez écrit que depuis OP n'a pas écrit que 3. OP n'a pas utilisé de référence à un const. Il a utilisé une référence à un pointeur non constitué qui pointe vers Const.



3
votes

Le problème est que les types ne correspondent pas et que vous ne pouvez donc pas créer de référence. xxx pré>

est légal. p> xxx pré>

est légal. p> xxx pré>

est une inadéquation . p>

Le message d'erreur de g ++ peut vous être utile: P>

int& added = 3 + 2;


4 commentaires

Merci, je vous aurais tenu comme le répondeur de cette question si vous aviez été plus tôt, mais oui INT * CONSTOY & PTR_REF = PTR; a résolu mon problème maintenant, je comprends qu'avant ce que je faisais en train de regarder Pour une référence à un const int * mais maintenant je comprends que c'est faux. Merci fourrette beaucoup!


@FunterTain, il est correct de changer une réponse acceptée si une nouvelle réponse aide plus d'une autre. La réponse acceptée est la première qui a été montrée aux futurs visiteurs, donc idéalement, ce serait celui qui est le plus utile en moyenne.


@FunterTain comme je l'ai signalé dans mon autre commentaire, avec int * const & ptr_ref = pTR; , l'int-lui-même est toujours mutable. Pour clarifier, je peux faire: * pTR_ref = 4; et le compilateur le permettra de manière heureuse. Vous devriez, à mon avis, avoir const designations. On dirait que vous voulez que la valeur int const , mais c'est aussi une très mauvaise idée de laisser le pointeur mutable. J'écrirais l'expression const int * consons ptr_ref = pTR; . C'est vraiment la référence qui est la partie qui a peu de sens.


... Bien que l'appelant "ptr_ref" alors est une sorte de fou. Encore une fois, cela dépend beaucoup de ce que vous faites réellement.