C++: référence const, avant vs après le spécificateur de type
Quelle est la différence entre les arguments dans:
int foo1(const Fred &arg) {
...
}
Et
int foo2(Fred const &arg) {
...
}
? Je ne vois pas ce cas couvert dans la FAQ parashift.
7 réponses
Aucune différence comme const est lu de droite à gauche par rapport au&, donc les deux représentent une référence à une instance Fred immuable.
Fred& const
cela signifierait que la référence elle-même est immuable, ce qui est redondant ; lorsqu'il s'agit de pointeurs const les deux Fred const*
et Fred* const
sont valides mais différents.
C'est une question de style, Mais je préfère utiliser const
comme suffixe car il peut être appliqué de manière cohérente en incluant const member functions.
Comportement
Il n'y a pas de différence sémantique entre const T&
et T const&
(ni entre const T*
et T const*
); le langage les traite comme du même type.
, Comme une question de style
En ce qui concerne ce que vous devriez préférer stylistiquement, cependant, je ne serai pas d'accord avec beaucoup d'autres réponses et je préférerai const T&
(et const T*
):
- {[0] } est le style utilisé dans le livre de Stroustrup le langage de programmation C++ .
-
const T&
est le style utilisé dans le c++ la norme elle-même. - {[2] } est le style utilisé dans le livre de K&R le langage de programmation C.
-
const T*
est le style utilisé dans la norme C. - en Raison des facteurs ci-dessus, je pense
const T&
/const T*
ont bien plus d'inertie queT const&
/T const*
.const T&
/const T*
empiriquement me semblent beaucoup plus communs queT const&
/T const*
dans tout le code C++ et C que j'ai vu. Je pense que suivre les pratiques courantes est plus lisible que d'adhérer dogmatiquement à l'analyse de droite à gauche règle. - avec
T const*
, il semble plus facile d'égarer le*
commeT* const
(surtout si les gens n'y sont pas aussi habitués). En revanche,const* T
n'est pas une syntaxe légale.
Qu'en est-il de la règle d'analyse de droite à gauche?
En ce qui concerne tout l'argument d'analyse de droite à gauche que les gens semblent aimer utiliser: comme je l'ai mentionné dans un commentaire à une autre réponse, const T&
lit bien de droite à gauche aussi. C'est une référence à une constante T. "T" et "constant" chacun peut travailler comme un adjectif ou un nom. (De plus, la lecture de T const*
de droite à gauche peut être ambiguë car elle peut être interprétée de manière incorrecte comme "constante de pointeur à T" au lieu de "pointeur à constante T".)
Bien qu'ils soient identiques, pour conserver la cohérence avec la règle RIGHT-LEFT sur l'analyse des déclarations C et c++, il est préférable d'écrire Fred const &arg
Reportez-vous également à this pour mieux comprendre les déclarations, les qualificatifs et les déclarateurs.
Aucune différence, les deux sont syntaxiquement et sémantiquement mêmes.
Tous les Deux, et ici est l'explication de l'homme qui l'a écrit.
Pour le citer:
Pourquoi? Quand j'ai inventé " const" (initialement nommé "readonly" et avait un correspondant "writeonly"), j'ai permis il pour aller avant ou après le type parce que je pourrais le faire sans ambiguïté.
Références ne fonctionne pas de la même manière que les pointeurs: pour les pointeurs, vous pouvez avoir "const pointeurs' (type * const p
) et "pointeur const' (const type * p
ou type const * p
).
Mais vous n'avez pas ceci pour les références: une référence se référera toujours au même objet; en ce sens, vous pouvez considérer que 'references' sont 'const references' (de la même manière que vous pouvez avoir 'const pointeurs').
Par conséquent, quelque chose comme 'type & const ref' n'est pas légal. Vous ne pouvez avoir de référence de type' (type &ref
) et 'référence à un type constant' (const type &ref
ou type const &ref
; les deux sont exactement équivalents).
Une dernière chose: même si const type
semble plus correct en anglais, écrire type const
permet une compréhension plus systématique des déclarations "de droite à gauche": int const & ref
peut être lu A 'ref est une référence à une constante int'. Ou un exemple plus compliqué: int const * const & ref
, ref est une référence à un pointeur constant vers une constante int.
Conclusion: dans votre question, les deux sont exactement équivalents.