A ce titre, un code const-correct apporte énormément de garanties que l'on ne pourrait avoir avec un code non const-correct qu'en le décortiquant avec le plus grand soin.
Dès lors, c'est peut être absurde, mais c'est viscérale chez moi : si je devais "pénaliser" le fait de transmettre par valeur constante et / ou par référence non constante des paramètres qui devraient (en toute logique) être transmis par référence constante, je pénaliserait le passage par référence non constante bien plus fermement (et fortement) que le passage par valeur constante.
Et cela, pour une raison bien simple :
Il suffira de transformer la valeur constante en référence constante dans le prototype pour résoudre les problèmes de performances, sans avoir à modifier la moindre ligne d'implémentation, vu que tout a déjà été mis en oeuvre pour respecter la constance des valeurs.
A contrario, tu ne peux pas
forcément avoir ce genre de garantie avec un passage par référence non constante : cela demande beaucoup plus de travail pour s'en assurer et, surtout, cela pourrait mener à des dérives au niveau du code pour éviter que le paramètre ne soit modifié qui pourraient prendre une forme (caricaturale, je te l'accorde ;) ) proche de
Code:
1 2 3 4 5 6 7
| void foo(Type & ref){
Type cache(ref);
/* modification de ref à sa guise ici
* ...
*/
ref = cache;
} |
Encore une fois, je comprends ton point de vue et je le respecte au plus haut point. Simplement, je ne suis pas
tout à fait d'accord avec toi (bien que globalement d'accord sur le principe ;) )
EDIT : En fait, ce que je voulais surtout dire lorsque j'ai décidé d'intervenir sur cette discussion pourrait se résumer à ceci : Je suis tout à fait d'accord que le passage d'un paramètre par valeur constante n'est pas bon, mais c'est "moins pire" et "plus facile à accepter" grâce à la valeur "informative" (au sens le plus large possible du terme) du mot clé const que les autres erreurs que l'on pourrait commettre au niveau du passage de paramètres ;)