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.

104
demandé sur eisbaw 2010-09-12 15:19:33

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.

91
répondu Sean Fausett 2015-09-15 20:32:18

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 que T const&/T const*. const T&/const T* empiriquement me semblent beaucoup plus communs 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 dogmatiquement à l'analyse de droite à gauche règle.
  • avec T const*, il semble plus facile d'égarer 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 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".)

99
répondu jamesdlin 2017-05-03 21:26:49

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.

14
répondu Chubsdad 2010-09-12 11:33:05
5
répondu Prasoon Saurav 2010-09-12 11:28:58

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

5
répondu Default 2013-10-25 16:01:09
3
répondu Nirocfz 2010-09-12 11:24:09

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.

1
répondu Cedric H. 2010-09-12 12:08:01