Pinaillage - En C++, le const, à gauche ou à droite ?

const T& ou T const& ?

Bienvenue dans cette nouvelle petite série d'articles intitulée "pinaillage", le but étant de traiter rapidement de petites questions sur la programmation.

Le sujet du jour, directement inspiré d'une discussion que je viens d'avoir sur le Discord de programmation Not a Name est de savoir si en C++, il faut mettre le const à gauche ou à droite du type sur lequel on veut qu'il s'applique.

Un argument souvent repris par les droitistes[1] est que le const à gauche est un cas spécial de la règle tirée de la norme, je cite :

La sainte norme du C++ :

« Const s'applique sur le type immédiatement à gauche, sauf s'il n'y a rien à gauche auquel cas il s'applique sur le type immédiatement à droite. »

Cela signifie dans l'écriture const T, le const cherche à s'appliquer sur l'élément à sa gauche, n'en trouve pas et se rabat sur l'élément à droite, l'écriture est donc strictement équivalente à T const.
Du coup les droitistes avancent souvent ne pas aimer les "sauf si" dans les règles et ne prendre que la première partie, donnant donc T const.

N'étant pas convaincu par cet argument, je m'amuse à leur rétorquer que moi non plus je n'aime pas les "sauf si", et que la règle en fait est celle-ci :

La sainte norme du C++, réinterprétée par le troll prophète Lynix :

« Const s'applique sur l'élément immédiatement à droite, sauf si un élément est présent à sa gauche auquel cas il s'applique dessus. »[2]

Vous l'aurez deviné, je suis gauchiste dans cette histoire, et l'argument que j'avance est que le cas const T(&) est de très, très loin le cas majoritaire en C++. Les écritures complexes du type T const* const (pointeur constant sur un T constant) sont très rares et peuvent (doivent ?) être simplifiées.

template<typename T> using ptr = T*;

-> const ptr<const T>

Je ne sais pas pour vous, mais moi je trouve ça plus clair.
(À voir : std::observer_ptr[3]).

Un autre argument que je pourrais sortir est que dans les autres langages, comme le Rust (let mut x, x : &mut type) ou le Typescript (const x), le const est systématiquement à gauche, d'ailleurs à ma connaissance il n'y a qu'en C ou en C++ que cette règle bizarre intervient.

Mon avis sur la question est qu'il faut privilégier la lisibilité, et que le const à gauche est devenu un standard de facto, notamment parce que le créateur du C++ (Bjarne Stroustrup) préfère également cette écriture[4].

Quant aux écritures complexes forçant un const à droite, je préfère les éviter en simplifiant l'expression, ou s'il le faut vraiment, en mettant le const à droite.

Ce que je retiens de mes années de C++ est que, même si le const à gauche joue sur une exception dans la règle des const, son utilisation à droite est également une exception ne justifiant pas un changement d'habitudes de programmation.

Alors évidemment, ça reste une affaire de goûts, je cherchais surtout à faire un article défendant le const à gauche, trouvant ce point de vue trop peu représenté parmis les développeurs "expérimentés", mais si vous préférez mettre le const à droite, il n'y a évidemment aucun problème avec ça.

Voilà qui conclut ce premier pinaillage, une série qui porte bien son nom, n'hésitez pas à donner votre avis dans les commentaires, et à bientôt !


  1. Évidemment, rien à voir avec la politique. ↩︎

  2. (en plus c'est plus court, donc plus facile à retenir, donc mieux ... :-°). ↩︎

  3. Déjà utilisable/utilisé avec les pointeurs intelligents du C++ (type std::unique_ptr, ...). ↩︎

  4. http://www.stroustrup.com/bs_faq2.html#constplacement ↩︎