En fait, non...
La valeur d'une fonction constante pour l'utilisateur est - effectivement - purement informative.
Tu peux en effet très bien envisager d'appeler une méthode constante sur un objet qui ne l'est pas.
se voit de manière très commune...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 void foo() { /* création d'un objet non constant */ std::vector<Type> tab; /* utilisation d'une méthode constante sur... un objet non constant */ if (tab.size()!=0) { /*...*/ } }
Par contre, c'est si l'objet est constant que cela se corse:
Le compilateur refusera tout appel à une méthode qui ne se sera pas engagée (par sa signature constante) à ne pas modifier l'objet, et cela fait force de loi pour lui.
La déclaration d'une méthode constante s'adresse donc bien en priorité au compilateur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void bar(const std::vector<Type>& tab) { /* tab est un objet constant */ tab.push_back (/*...*/ ) /* Refusé: push_back ne s'est pas engagée * à ne pas modifier l'objet */ if(tab.size() == 0) // accepté : size() est une méthode constante { /*...*/ } }
Le compilo vérifie des choses avec le const, mais c'est bien avant tout une précision sur l'état visible, donc qui concerne plus l'utilisateur qu'autre chose.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 struct Titi { void change(); }; struct Toto { void f() const { m_p -> change(); } private: Titi * m_p; };
Quand je dis que c'est pour le développeur, c'est que j'ai mes raisons
Je renvoie à ce que Herb Sutter dit du mot-clé const, et je suis d'accord avec lui. C'est surtout pour empêcher le développeur de faire n'importe quoi. Mais derrière, le compilateur ne va pas activer des optimisations spécifiques, parce qu'il ne peut pas, à cause des mutable, des pointeurs vers les classes, ...
Il peut en activer certaines quand une fonction const est définie inline, bien sûr.
Ensuite, je pense qu'on doit pouvoir régler le compilo pour qu'il suppose que les fonctions membres const ne font pas de const_cast, permettant des optimisations pour les membres ni pointeurs ni mutables. Si le "Assume no aliasing" existe, une telle option doit exister aussi...
Pas encore trouvé cette option alors, et pourtant, j'ai scanné pas mal d'options de compilateurs ces dernières semaines.
const ou pas const, s'il constate que tout le code est const, il va faire les mêmes choses, les mêmes optimisations. Donc c'est vraiment au développeur de faire attention à bien différentier les deux si le besoin s'en fait sentir.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager