Matthias (OP)> En effet, la méthode Left() renvoie un const...
J'ai l'impression en lisant cela que tu t'es contenté de lever le const du type de retour et que cela passe maintenant. Ce qui me parait surprenant. Quelle version de GCC utilises-tu ?
NB: même si cela passe avec un ancienne version de GCC (ou tout autre vieux compilo VC6, SunWSPro 5.4, ...) il ne faut pas s'attendre à ce que cela continue ainsi -- GCC a été patché, VC a dû l'être aussi. Comme je l'ai déjà signalé il n'y a que 3 corrections valables -- et en plus compatibles avec les vieux compilos. Retirer le const n'en est pas une.
-> DString Experiment::FullShotPath(DString const&relativepath) ; si FullShotPath n'altère pas l'objet reçu en paramètre.
-> DString Experiment::FullShotPath(DString relativepath) ; si FullShotPath n'altère pas l'objet reçu en paramètre et que l'on est prêts à payer une copie.
-> Temporaire nommé intermédiaire
Dit autrement, retirer le const ne servira que sur les environnements sur lesquels on n'a pas réalisé de monté de version des compilos depuis pratiquement 8 ans.
Bench> certains compilos n'aiment pas que l'on passe un paramètre temporaire non 'const' (ex: DString ) en à une fonction qui accepte une référence (DString&)
Deux précisions:
- ce n'est pas certains compilos, mais les compilos à jour sur ce point de la norme. Ceux qui ne le sont pas encore le seront très probablement dans le futur,
- que le paramètre temporaire soit const ou pas ne change rien. Une référence ne peut pas être attachée à un temporaire.
Bench> Une bonne pratique est de doubler ses fonctions type get(), l'une qui renvoit un const et l'autre un modifiable (c'est ce que fait la stl à tour de bras pour les méthodes begin() et end() )
Cela ne s'utilise pas dans le même contexte. Si getLeft() renvoie une valeur créée à la volée et ne modifie pas l'objet sur lequel elle est appliqué, alors la fonction doit être const, et renvoyer une copie. Que la copie renvoyée soit const empêche, aujourd'hui, d'appeler des fonctions (membre) non const sur l'objet renvoyé.
Les deux versions de begin() et end() des conteneurs de la SL permettent d'obtenir des itérateurs vers des données modifiables, sauf pour les conteneurs non modifiables qui ne permettent d'obtenir que des itérateurs vers des données itérables non modifiables.
[^] # Re: const?
Posté par lmg HS (site web personnel) . En réponse au message Adresse d'un objet?. Évalué à 2.
J'ai l'impression en lisant cela que tu t'es contenté de lever le const du type de retour et que cela passe maintenant. Ce qui me parait surprenant. Quelle version de GCC utilises-tu ?
NB: même si cela passe avec un ancienne version de GCC (ou tout autre vieux compilo VC6, SunWSPro 5.4, ...) il ne faut pas s'attendre à ce que cela continue ainsi -- GCC a été patché, VC a dû l'être aussi. Comme je l'ai déjà signalé il n'y a que 3 corrections valables -- et en plus compatibles avec les vieux compilos. Retirer le const n'en est pas une.
-> DString Experiment::FullShotPath(DString const&relativepath) ; si FullShotPath n'altère pas l'objet reçu en paramètre.
-> DString Experiment::FullShotPath(DString relativepath) ; si FullShotPath n'altère pas l'objet reçu en paramètre et que l'on est prêts à payer une copie.
-> Temporaire nommé intermédiaire
Dit autrement, retirer le const ne servira que sur les environnements sur lesquels on n'a pas réalisé de monté de version des compilos depuis pratiquement 8 ans.
Deux précisions:
- ce n'est pas certains compilos, mais les compilos à jour sur ce point de la norme. Ceux qui ne le sont pas encore le seront très probablement dans le futur,
- que le paramètre temporaire soit const ou pas ne change rien. Une référence ne peut pas être attachée à un temporaire.
Cela ne s'utilise pas dans le même contexte. Si getLeft() renvoie une valeur créée à la volée et ne modifie pas l'objet sur lequel elle est appliqué, alors la fonction doit être const, et renvoyer une copie. Que la copie renvoyée soit const empêche, aujourd'hui, d'appeler des fonctions (membre) non const sur l'objet renvoyé.
Les deux versions de begin() et end() des conteneurs de la SL permettent d'obtenir des itérateurs vers des données modifiables, sauf pour les conteneurs non modifiables qui ne permettent d'obtenir que des itérateurs vers des données itérables non modifiables.