Bonjour.
Prenons le code suivant (ce code est inutile et faux, il sert juste à illustrer le problème existentiel qui m'habite):
La fonction Foo::FindElement doit trouver un élément en fonction de son nom (ce nom est la clé de la map Foo::container). S'il le trouve, il renvoie une référence sur cet élément, sinon il renvoie un référence vers un objet bidon Foo::void_element. Le parametre found de la fonction détermine si l'élément a été trouvé ou non.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 class Foo { private: Element void_element; map< string, Element > container; public: Element & FindElement( const string & element_name, bool & found ) { auto element = container.find( element_name ); if ( element == container.end() ) { // on a pas trouvé l'élément recherché found = false; return void_element; } else { // on l'a trouvé found = true; return *it; } } };
Mon problème est le suivant: Cette fonction FindElement ne modifie pas la classe Foo, et elle n'est pas sensée le faire. Donc en toute logique, elle devrait être const. Seulement, si on déclare cette fonction comme constante, alors la référence qu'elle renvoie devra aussi être constante. Et c'est ça que je ne comprend pas. La philosophie de la constance d'une fonction est que cette fonction ne modifie pas l'état de la classe, mais pourquoi donc sommes-nous obligé de retourner une référence constante lorsque l'objet retourné est membre la classe? Comment fait-on si, par exemple, l'appelant veut pouvoir modifier l'élément renvoyé par cette fonction?
Partager