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 de parashift.
Aucune différence car const est lu de droite à gauche en ce qui concerne le &, ainsi les deux représentent une référence à une instance immuable de Fred.
Fred& const
signifierait que la référence elle-même est immuable, ce qui est redondant ; quand on traite avec const pointers 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, y compris fonctions membres const .
Il n'y a pas de différence sémantique entre const T&
et T const&
; la langue les traite comme du même type. (La même chose s'applique à const T*
et T const*
.)
En ce qui concerne ce que vous devriez préférer stylistiquement, cependant, je me dissocierai de beaucoup d’autres réponses et préférerai const T&
(et const T*
):
const T&
est le style utilisé dans le livre Le langage de programmation C++ de Stroustrup.const T&
est le style utilisé dans la norme C++ elle-même.const T*
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.const T&
/const T*
ont beaucoup plus d’inertie que T const&
/T const*
. const T&
/const T*
me semble empiriquement beaucoup plus commun que T 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 de manière dogmatique aux règles d’analyse syntaxique de droite à gauche.T const*
, il semble plus facile de perdre le *
comme T* const
_ (surtout si les gens n'y sont pas aussi habitués). En revanche, const* T
n'est pas une syntaxe légale.En ce qui concerne l'argument d'analyse syntaxique 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 aussi de droite à gauche. C'est une référence à une constante T. "T" et "constant" chacun peut fonctionner comme un adjectif ou un nom. (De plus, en lisant T const*
de droite à gauche peut être ambigu, car il pourrait être interprété incorrectement comme "constante du pointeur à T" au lieu de "pointeur à constante T" .)
Bien que identiques, pour conserver la cohérence avec la règle RIGHT-LEFT concernant l'analyse des déclarations C et C++, il est préférable d'écrire Fred const &arg
Reportez-vous également à this pour en savoir plus sur les déclarations, les qualificateurs et les déclarateurs.
Les deux fonctionnent, et ici est l'explication de l'homme qui l'a écrite.
Pour le citer:
Pourquoi? Quand j'ai inventé "const" (initialement nommé "readonly" et que j'avais "writeonly" correspondant), je l'ai laissé passer avant ou après le type car je pouvais le faire sans ambiguïté.
Pas de différence, les deux sont syntaxiquement et sémantiquement identiques.
Aucune différence http://c-faq.com/ansi/constptrconst.html
Les références ne fonctionnent pas de la même manière que les pointeurs: pour les pointeurs, vous pouvez avoir des "pointeurs constants" (type * const p
) et 'pointeur sur const' (const type * p
ou type const * p
).
Mais vous n'avez pas cela pour les références: une référence fera toujours référence au même objet; dans ce sens, vous pouvez considérer que les "références" sont des "références const" (de la même manière que vous pouvez avoir des "pointeurs const").
Par conséquent, quelque chose comme 'type & const ref' n'est pas légal. Vous ne pouvez avoir que 'reference to type' (type &ref
) et 'référence au 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, en écrivant 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 sur une constante int.
Conclusion: dans votre question, les deux sont exactement équivalents.