Bonjour,
est-ce que ça choque quelqu'un si j'écris quelque chose du style :
void MyFunction( const string & defaultParam = "" );
Version imprimable
Bonjour,
est-ce que ça choque quelqu'un si j'écris quelque chose du style :
void MyFunction( const string & defaultParam = "" );
Ben non. :)
super merci, je voulais être sûr !
Euh si. J'aurais préféré
void MyFunction( string const & defaultParam = "" );
:mrgreen:
On préfère donc TYPE const qui est la règle à const TYPE qui est l'exception.Citation:
Envoyé par FAQ
mais pour le retour des fonctions, c'est bien :
const string & GetXXX() const;
je me trompe ?
string const & getXXX() const, c'est kifkif
Sinon, pour le param par défaut, moi je ferais
void MyFunction( string const & defaultParam = *(string *)0 );
gniarkgniarkgniark :mouarf:
Meunon, c'est ceci bien sur:
void MyFunction( const string & defaultParam = string() );
(meta-x mode-side-discussion-on)
Étrangement, je suis en train d'écrire le contraire dans un article à paraitre sur mon blog. Mon opinion est que la notation qu'on utilise pour les références constantes se doit de suivre celle qu'on utilise pour les pointeurs vers des instances constantes. Hors, X const* p peut être aisément confondu avec X * const p par le néophyte, parce qu'il faut être honnête, ça n'est pas toujours facile pour s'y retrouver. SI, pour rendre le code moins brouillon, on utilise const X* p au lieu de X const* p, alors on utilise aussi const X& r au lieu de X const& r. Un effet de bord est que ça nous permet à nouveau de lire la déclaration de la gauche vers la droite, tout en réintroduisant une sémantique plus intuitive (mais (je l'accorde volontiers) moins formelle) de "type constant" et de "variables constantes". ainsi, const X* const p est une "variable constante de type pointeur vers un type constant". Ce n'est bien évidemment pas la panacée, mais étant donné qu'il est plus difficile de définir ce qu'est un pointeur constant (qu'est-ce qui est constant : la valeur du pointeur ou l'instance pointée ?) qu'une variable constante (la variable, c'est à dire dans ce cas la valeur du pointeur, ne peut pas être modifiée), ça me convient assez bien.
Et puis ça a le mérite d'être cohérent avec les définitions des fonctions/méthodes de la C++SL telles que données dans le texte du standard lui-même, où la notation X const& r n'est pas utilisée.
(meta-x mode-side-discussion-off)
Dans les histoires de styles, on confronte plus souvent des opinions que des faits. Et par conséquent, on est susceptible d'avoir d'interminables débats ;).
Mais quand même...
Comprendre type fonction() const; est plus naturel si on intègre que le const s'applique à ce qui précède.
Toujours avec la règle du 'précède', je trouve plus naturel de comprendre la différence entre type const * et type * const, que de faire le grand saut entre const type * et type * const.
Mais pour être totalement franc, je pense que de toute façon, dès qu'on introduit un pointeur (c'est moins vrai avec la référence car elle n'est pas modifiable), on introduit du doute (par rapport à ce const, entre autre). Et in fine, je ne pense pas qu'un écriture plutôt que l'autre clarifie vraiment la chose. La meilleur règle est peut être encore ... d'avoir une constance d'écriture dans les projets.
Hourra !Citation:
Envoyé par Emmanuel Deloget
A bas la dictature des Type & const !
Et je propose la motion suivante : Sera pendu haut et court, toute personne qui vient pinailler à chaque fois que l'on parle de référence constante "gnagnagna une référence est forcément constante gnagnagna".
:mrgreen:
Salut,A vrai dire, depuis que j'ai appris qu'il s'appliquait à ce qui le précède et que j'en ai compris la raison (le code est, pour un groupe donné de mots/termes interprété de droite à gauche par le compilateur), j'ai pris l'habitude de placer const après sans même y penser...
Je reconnais cependant, que rien n'aide forcément à prendre cette habitude dans le sens où l'intellisens, lorsqu'il présente la liste des arguments, et parfois même les messages d'erreurs/d'avertissement le placent régulièrement devant le type :P
Ceci dit, j'ai quelque part l'impression que, pour beaucoup, les habitudes se forgent au gré de ce qu'ils rencontrent le plus souvent, et, comme il me semble qu'on rencontre, dans du code que l'on n'a pas écrit, plus souvent const type que type const, je peux comprendre que beaucoup prennent / gardent cette habitude, sans même jamais s'être posé la question de savoir ce que disait la norme sur le sujet.
Comme, en plus, la norme n'est franchement pas le genre de truc qu'on peut lire comme s'il s'agissait d'un bon roman, on peut très facilement comprendre que pas mal de gens n'y poseront jamais un oeil :P;)
Si on regarde dans le bouquin "Standards de programmation en c++" de Sutter & Alexandrescu, qui fait quand même office de référence, les exemples sont écrits de la manière suivante :
const T &
Après, tout dépend effectivement des habitudes que l'on a prise.
D'après la page suivante, la déclaration 'T const' a été introduite par Dan Sacks : "const s'applique toujours à ce qui le précède".
http://fr.wikibooks.org/wiki/Program.../Les_pointeurs
const char * msg; // déclaration habituelle
char const * msg; // déclaration Sacks
Je suis personne, mais je contredis : c'est absolument inesthétique !
:dehors: