Re: G++ v3.4.4 & template
On 8 mar, 22:10, "Gilles DRIDI" <gdr...@club-internet.fr> wrote:
> Bonsoir, à propos des templates pour les débutants avec G++
> Le compilo ne fournit pas un message clair signifiant qu'il
> s'agit d'un problème de const mais ...
> Ce qu'il faut savoir : c'est qu'un objet temporaire est
> toujours const.
Non. Un object temporaire n'est const que si on l'a déclaré
const, par exemple, la valeur de retour de :
MaClasse const f() ;
Sinon, il n'est pas const. Et la façon la plus courante
d'obtenir un temporaire, MaClasse(), ne permet pas le const.
> Donc, l'objet temporaire à droite du signe égal est const :
> c'est le résultat de l'addition.
Ce n'est pas forcement une mauvaise idée de déclarer la valeur
de retour d'un operator+ const, mais j'ai bien vu pas mal du
code où ce n'était pas le cas. (Dont les miens, d'ailleurs.)
> Il faut encore modifié l'operateur d'affectation pour qu'il
> prenne un const ainsi que le constructeur de recopie.
À vrai dire... Il faut les déclarer à prendre les références à
const dès le début. (Donc, pas de modification.) Sauf,
peut-être, l'opérateur d'affectation, où certains (pas moi)
préfèrent le faire prendre le paramètre par valeur.
Je dirais que tout celà fasse partie du b a ba de C++, et doit
être expliqué dans n'importe quel livre de base.
Aussi, même si le temporaire n'est pas const, il y a une règle
qui dit qu'une référence à non-const ne peut pas être
initialisée par un temporaire. Règle qui ne s'applique pas aux
fonctions membre. (Mais il y a encore une autre règle qui fait
que les résultats des conversions implicites ne sont pas
considérés pour le paramètre this dans la résolution du
surcharge.) Donc, si tu déclares l'opérateur + comme membre,
avec un paramètre référence à non-const, tu peux bien utiliser
un temporaire pour la côté gauche, mais pas pour la côté droit.
Et les conversions implicites ne seront jamais prises en compte,
à gauche, parce qu'on ne les considère pas pour le paramètre
this, et à droite, parce que le résultat d'une conversion est un
temporaire, qui ne peut pas servir à initialiser une référence à
non-const. Que tu le déclares membre, avec un paramètre
référence à const, les conversions implicites ne seront pas
prises en compte à gauche, mais marcheront bien à droite. Que tu
le déclares non-membre, avec les références à const pour les
deux paramètres, et on peut se servir des conversions et
d'autres temporaires et à droite et à gauche. C'est l'idiome
consacré.
> Finesse suprême, il faut que l'opérateur d'accès soit définit
> const :
> operateur [] (long i) const { return tab[i]; }
> Avec le const à cette place là cela veut dire que la fonction
> ne modifie pas l'état des membres de l'objet.
Normallement, on en déclare deux. Un const, et l'autre non.
Celui const renvoie soit un objet (temporaire), soit, plus
souvent, une référence à const. Celui non-const renvoie une
référence non-const, qui permet la modification de l'élément.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|