web-dev-qa-db-fra.com

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 de parashift.

127
eisbaw

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 .

103
Sean Fausett

Comportement

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

Comme une question de style

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.
  • En raison des facteurs susmentionnés, je pense que 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.
  • Avec 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.

Qu'en est-il de la règle d'analyse syntaxique de droite à gauche?

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

115
jamesdlin

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.

13
Chubsdad

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

7
Default
5
Prasoon Saurav
3
Nirocfz

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.

2
Cedric H.