2009-06-23 7 views
72

Existe-t-il une différence entre les déclarations suivantes?paramètres de référence const

void somefunc(const Person &p); 
void somefunc(Person const &p); 
+8

Vous devriez noter que la référence n'est pas pertinente à la question: "const Person p" est également équivalent à "Person const p". –

Répondre

91

il n'y a pas de différence . const se lie au type à sa gauche ... sauf s'il s'agit de la première partie de la déclaration, auquel cas il se lie à droite.

Voir: https://isocpp.org/wiki/faq/const-correctness#const-ref-alt

Personnellement, je trouve que const T &x lit mieux. Selon this, Bjarne préfère également mettre le const en premier. Plus précisément parce que le mot-clé allait à l'origine s'appeler readonly et readonly int x se lit mieux :-P.

+1

Bien que je dirais que le premier est plus commun. – rlbond

+0

@rlbond: Plus commun dépend d'un contexte. Dans certains endroits, je vois le premier plus commun chez les autres, je vois le second plus commun. Tout se passe. –

+6

certainement le second est plus * consistant * lorsqu'il s'agit d'indirection. par exemple: int const * const x; (tout lie à gauche) –

11

Voir cette http://www.parashift.com/c++-faq-lite/const-correctness.html

(Voir nouveau lien à la place: https://isocpp.org/wiki/faq/const-correctness#const-ref-alt)

Plus précisément 18,6 à 18,8.

[18.6] Qu'est-ce que "const Fred & x" signifie?

Cela signifie x alias un objet Fred, mais x ne peut pas être utilisé pour modifier cet objet Fred.

[18.7] Est-ce que "Fred & const x" a un sens?

Non, c'est un non-sens.

[18.8] Que signifie "Fred const & x"?

Fred const & x est fonctionnellement équivalent à const Fred & x. Cependant, la véritable question est qui devrait être utilisé.

Lire le reste de l'article pour plus d'informations. Mais essentiellement, il dit qu'ils sont équivalents, et vous pouvez utiliser l'un ou l'autre comme bon vous semble. Cependant, vous devriez en choisir un et rester avec lui, pour éviter toute confusion future.

+4

Je vais ajouter, en choisir un et s'en tenir à cela lors de l'écriture du nouveau code, mais en modifiant le code existant, s'en tenir à la façon dont le code existant le fait. –

47

Oui, il y en a! le premier est plus lisible :)

+0

Je suppose que vous voulez dire "plus lisible à ceux qui lisent LTR!" :) J'ai entendu des gens dans l'est lire leur texte RTL. –

+2

Non! La deuxième! (Vraiment - vous devez lire les définitions de droite à gauche: Person const * volatile * p; // p est un pinter volatile à un pointeur cont à une personne.) – MSalters

+1

@litb :: J'ai lu un de ces langages RTL et ce n'est pas difficile parce que c'est ma langue maternelle: D – AraK

4

C'est vraiment une question de goût.

Si lu de droite à gauche, "Person const & x" indique "x est une référence à une personne constante".

Cela sonne mieux que "const Person & x", ce qui serait "x est une référence à une personne, qui est constante." Donc, si l'on connaît la direction de lecture droite-à-gauche des déclarations de variables, on préférera peut-être la première.

4

Les deux sont les mêmes.

const Personne & x est actuellement le plus populaire, parce que l'anglais met des adjectifs avant les noms, et qui le rend "plus anglais comme".

La forme alternative, Person const & x, a été suggérée comme une forme moins idiomatique. Leur argument était que cette forme peut toujours être analysée de droite à gauche, "x est une référence à une personne const." L'argument était que la clarté de l'analyse était plus importante que la structure idiomatique.

Malheureusement pour ces personnes, leur forme ne gère pas tout. Une fois que vous commencez à voir des tableaux et des pointeurs de fonction et d'autres formes exotiques, les règles commencent à tomber en panne. char * str [10] ne peut pas être écrit de droite à gauche car le tableau doit être sur le côté droit. void (* signal (int, void (* fp) (int))) (int) fait grincer des dents les personnes de droite à gauche.

seule règle n'a jamais rognés pour donner un sens de tous les types, la règle Spiral Clockwise: http://c-faq.com/decl/spiral.anderson.html

Habituellement, une fois que quelqu'un voit la spirale dans le sens horaire, tous les espoirs d'une règle d'analyse claire va par la fenêtre. La plupart des gens acceptent alors que la personne const & x est probablement le meilleur chemin à parcourir!

Questions connexes