Exceptionnellement, dans certains cas où aucune ambiguïté n'est
possible, il est aussi permis de mettre le const avant, par
exemple :
const A* p ;
Exceptionnellement, dans certains cas où aucune ambiguïté n'est
possible, il est aussi permis de mettre le const avant, par
exemple :
const A* p ;
Exceptionnellement, dans certains cas où aucune ambiguïté n'est
possible, il est aussi permis de mettre le const avant, par
exemple :
const A* p ;
Il y a aussi une exception en ce qui concerne les objets
const -- si l'objet a un type classe, et contient au moins
un membre mutable, on peut le modifier légalement, même s'il
est défini const.
Tiens, je sais pas ça. Et j'arrive pas à trouver où c'est
défini dans la norme. Tout ce que je vois, c'est :Except that any class member declared mutable (7.1.1) can be
modified, any attempt to modify a const object during its
lifetime (3.8) results in undefined behavior.
Je vois qu'on peut modifier le membre mutable, mais rien du
reste de l'objet.
Il y a aussi une exception en ce qui concerne les objets
const -- si l'objet a un type classe, et contient au moins
un membre mutable, on peut le modifier légalement, même s'il
est défini const.
Tiens, je sais pas ça. Et j'arrive pas à trouver où c'est
défini dans la norme. Tout ce que je vois, c'est :
Except that any class member declared mutable (7.1.1) can be
modified, any attempt to modify a const object during its
lifetime (3.8) results in undefined behavior.
Je vois qu'on peut modifier le membre mutable, mais rien du
reste de l'objet.
Il y a aussi une exception en ce qui concerne les objets
const -- si l'objet a un type classe, et contient au moins
un membre mutable, on peut le modifier légalement, même s'il
est défini const.
Tiens, je sais pas ça. Et j'arrive pas à trouver où c'est
défini dans la norme. Tout ce que je vois, c'est :Except that any class member declared mutable (7.1.1) can be
modified, any attempt to modify a const object during its
lifetime (3.8) results in undefined behavior.
Je vois qu'on peut modifier le membre mutable, mais rien du
reste de l'objet.
Je ne comprends pas ce que tu essaies de dire.
Une connerie, très probablement... Mais en gros je partais du principe
En revanche, on peut toujours appliquer un const_cast à cette
expression, ce qui donne une nouvelle expression, qui lui n'est
pas forcément const.
Familièrement, on peut dire que tu utilises
const_cast pour dire que l'objet en question n'est pas const,
même si l'expression l'est. Et si dans ce cas, l'objet est
const, tu as menti au compilateur.
Je ne suis pas certain de comprendre... Mais c'est peut etre lié à la
A f() const ; // C'est la fonction qui est const
Ce qui signifie qu'elle doit laisser l'objet inchangé, non ?
Je ne comprends pas ce que tu essaies de dire.
Une connerie, très probablement... Mais en gros je partais du principe
En revanche, on peut toujours appliquer un const_cast à cette
expression, ce qui donne une nouvelle expression, qui lui n'est
pas forcément const.
Familièrement, on peut dire que tu utilises
const_cast pour dire que l'objet en question n'est pas const,
même si l'expression l'est. Et si dans ce cas, l'objet est
const, tu as menti au compilateur.
Je ne suis pas certain de comprendre... Mais c'est peut etre lié à la
A f() const ; // C'est la fonction qui est const
Ce qui signifie qu'elle doit laisser l'objet inchangé, non ?
Je ne comprends pas ce que tu essaies de dire.
Une connerie, très probablement... Mais en gros je partais du principe
En revanche, on peut toujours appliquer un const_cast à cette
expression, ce qui donne une nouvelle expression, qui lui n'est
pas forcément const.
Familièrement, on peut dire que tu utilises
const_cast pour dire que l'objet en question n'est pas const,
même si l'expression l'est. Et si dans ce cas, l'objet est
const, tu as menti au compilateur.
Je ne suis pas certain de comprendre... Mais c'est peut etre lié à la
A f() const ; // C'est la fonction qui est const
Ce qui signifie qu'elle doit laisser l'objet inchangé, non ?
On 9 Dec 2005 00:51:46 -0800, "kanze" :
Exceptionnellement, dans certains cas où aucune ambiguïté
n'est possible, il est aussi permis de mettre le const avant,
par exemple :
const A* p ;
Y a-t-il des autres cas ?
On 9 Dec 2005 00:51:46 -0800, "kanze" <kanze@gabi-soft.fr>:
Exceptionnellement, dans certains cas où aucune ambiguïté
n'est possible, il est aussi permis de mettre le const avant,
par exemple :
const A* p ;
Y a-t-il des autres cas ?
On 9 Dec 2005 00:51:46 -0800, "kanze" :
Exceptionnellement, dans certains cas où aucune ambiguïté
n'est possible, il est aussi permis de mettre le const avant,
par exemple :
const A* p ;
Y a-t-il des autres cas ?
Je ne comprends pas ce que tu essaies de dire.
Une connerie, très probablement... Mais en gros je partais du
principe qu'en déclarant quelque chose const, je laisse au
compilo l'opportunité de ne meme pas reserver de mémoire pour
tout ou partie de ce quelque chose. Comme dans "const int
i=2", où le compilo va se sentir autorisé à remplacer tous mes
"i" par des "2".
Bref, dans ce cas, c'est pas physiquement possible de changer
la valeur dans la mesure où physiquement justement, elle n'a
meme pas d'emplacement... Et je remarquais que lorsqu'on
pointe sur un objet const, bien c'est qu'on a forcément une
adresse mémoire où trouver l'objet. Qu'il a donc bien un
amplacement physique, et que meme si c'est mal, bein on peut
le modifier quitte à dire qu'on sait ce qu'on fait (via
const_cast).
En revanche, on peut toujours appliquer un const_cast à cette
expression, ce qui donne une nouvelle expression, qui lui
n'est pas forcément const. Familièrement, on peut dire que tu
utilises const_cast pour dire que l'objet en question n'est
pas const, même si l'expression l'est. Et si dans ce cas,
l'objet est const, tu as menti au compilateur.
Je ne suis pas certain de comprendre... Mais c'est peut etre
lié à la définition de lvalue. Au risque de passer pour un
abruti je vais quand m'assurer d'avoir bien compris ce
qu'était une lvalue : "une expression quelconque qui ne
désigne pas dirrectement un objet mais qui une fois résolue
désigne un objet"
Par exemple :
A *p=new std::vector<A>();A *q=new std::vector<A>(); *p[1]=*q[1]; //
*p[1] et *q[1] sont des lvalue.
Question : dans A *p=new A();A *q=new A();*p=*q; qu'en est-il
de *p et *q ?
Ce sont des expressions qui se résolvent en objets de type A,
mais à la base ce sont de pointeurs, et donc aussi des
objets...
La notation const A, A const :
Dans ma 2nde édition Stoustrup au chapitre des const (p67) on
ne parle pas de la notation "int const bidule"...
A f() const ; // C'est la fonction qui est const
Ce qui signifie qu'elle doit laisser l'objet inchangé, non ?
Je ne comprends pas ce que tu essaies de dire.
Une connerie, très probablement... Mais en gros je partais du
principe qu'en déclarant quelque chose const, je laisse au
compilo l'opportunité de ne meme pas reserver de mémoire pour
tout ou partie de ce quelque chose. Comme dans "const int
i=2", où le compilo va se sentir autorisé à remplacer tous mes
"i" par des "2".
Bref, dans ce cas, c'est pas physiquement possible de changer
la valeur dans la mesure où physiquement justement, elle n'a
meme pas d'emplacement... Et je remarquais que lorsqu'on
pointe sur un objet const, bien c'est qu'on a forcément une
adresse mémoire où trouver l'objet. Qu'il a donc bien un
amplacement physique, et que meme si c'est mal, bein on peut
le modifier quitte à dire qu'on sait ce qu'on fait (via
const_cast).
En revanche, on peut toujours appliquer un const_cast à cette
expression, ce qui donne une nouvelle expression, qui lui
n'est pas forcément const. Familièrement, on peut dire que tu
utilises const_cast pour dire que l'objet en question n'est
pas const, même si l'expression l'est. Et si dans ce cas,
l'objet est const, tu as menti au compilateur.
Je ne suis pas certain de comprendre... Mais c'est peut etre
lié à la définition de lvalue. Au risque de passer pour un
abruti je vais quand m'assurer d'avoir bien compris ce
qu'était une lvalue : "une expression quelconque qui ne
désigne pas dirrectement un objet mais qui une fois résolue
désigne un objet"
Par exemple :
A *p=new std::vector<A>();A *q=new std::vector<A>(); *p[1]=*q[1]; //
*p[1] et *q[1] sont des lvalue.
Question : dans A *p=new A();A *q=new A();*p=*q; qu'en est-il
de *p et *q ?
Ce sont des expressions qui se résolvent en objets de type A,
mais à la base ce sont de pointeurs, et donc aussi des
objets...
La notation const A, A const :
Dans ma 2nde édition Stoustrup au chapitre des const (p67) on
ne parle pas de la notation "int const bidule"...
A f() const ; // C'est la fonction qui est const
Ce qui signifie qu'elle doit laisser l'objet inchangé, non ?
Je ne comprends pas ce que tu essaies de dire.
Une connerie, très probablement... Mais en gros je partais du
principe qu'en déclarant quelque chose const, je laisse au
compilo l'opportunité de ne meme pas reserver de mémoire pour
tout ou partie de ce quelque chose. Comme dans "const int
i=2", où le compilo va se sentir autorisé à remplacer tous mes
"i" par des "2".
Bref, dans ce cas, c'est pas physiquement possible de changer
la valeur dans la mesure où physiquement justement, elle n'a
meme pas d'emplacement... Et je remarquais que lorsqu'on
pointe sur un objet const, bien c'est qu'on a forcément une
adresse mémoire où trouver l'objet. Qu'il a donc bien un
amplacement physique, et que meme si c'est mal, bein on peut
le modifier quitte à dire qu'on sait ce qu'on fait (via
const_cast).
En revanche, on peut toujours appliquer un const_cast à cette
expression, ce qui donne une nouvelle expression, qui lui
n'est pas forcément const. Familièrement, on peut dire que tu
utilises const_cast pour dire que l'objet en question n'est
pas const, même si l'expression l'est. Et si dans ce cas,
l'objet est const, tu as menti au compilateur.
Je ne suis pas certain de comprendre... Mais c'est peut etre
lié à la définition de lvalue. Au risque de passer pour un
abruti je vais quand m'assurer d'avoir bien compris ce
qu'était une lvalue : "une expression quelconque qui ne
désigne pas dirrectement un objet mais qui une fois résolue
désigne un objet"
Par exemple :
A *p=new std::vector<A>();A *q=new std::vector<A>(); *p[1]=*q[1]; //
*p[1] et *q[1] sont des lvalue.
Question : dans A *p=new A();A *q=new A();*p=*q; qu'en est-il
de *p et *q ?
Ce sont des expressions qui se résolvent en objets de type A,
mais à la base ce sont de pointeurs, et donc aussi des
objets...
La notation const A, A const :
Dans ma 2nde édition Stoustrup au chapitre des const (p67) on
ne parle pas de la notation "int const bidule"...
A f() const ; // C'est la fonction qui est const
Ce qui signifie qu'elle doit laisser l'objet inchangé, non ?
Tout à fait. Quand l'objet est const (et non volatile)
Oh, tiens, bein tant qu'à y etre, qu'est-ce que ça signifie
Pas tout à fait -- ce que tu as écrit n'est pas du C++ légal,
Je supposes que ce qui manque pour que ce soit légal, c'est une
Mais je suis curieux à ce que tu pensais faire dans ton exemple.
Rien de particulier, c'etait juste histoire d'avoir des pointeurs sur
contient au moins un membre mutable, on peut le modifier
Par curiosité : quel est l'interret de "mutable" ?
Tout à fait. Quand l'objet est const (et non volatile)
Oh, tiens, bein tant qu'à y etre, qu'est-ce que ça signifie
Pas tout à fait -- ce que tu as écrit n'est pas du C++ légal,
Je supposes que ce qui manque pour que ce soit légal, c'est une
Mais je suis curieux à ce que tu pensais faire dans ton exemple.
Rien de particulier, c'etait juste histoire d'avoir des pointeurs sur
contient au moins un membre mutable, on peut le modifier
Par curiosité : quel est l'interret de "mutable" ?
Tout à fait. Quand l'objet est const (et non volatile)
Oh, tiens, bein tant qu'à y etre, qu'est-ce que ça signifie
Pas tout à fait -- ce que tu as écrit n'est pas du C++ légal,
Je supposes que ce qui manque pour que ce soit légal, c'est une
Mais je suis curieux à ce que tu pensais faire dans ton exemple.
Rien de particulier, c'etait juste histoire d'avoir des pointeurs sur
contient au moins un membre mutable, on peut le modifier
Par curiosité : quel est l'interret de "mutable" ?
Tout à fait. Quand l'objet est const (et non volatile)
Oh, tiens, bein tant qu'à y etre, qu'est-ce que ça signifie
exactement "volatile" ? D'après ce que j'en comprends ça sert à
demander au compilo de laisser tomber toutes les optimisations sur
cet objet...
contient au moins un membre mutable, on peut le modifier
Par curiosité : quel est l'interret de "mutable" ?
Tout à fait. Quand l'objet est const (et non volatile)
Oh, tiens, bein tant qu'à y etre, qu'est-ce que ça signifie
exactement "volatile" ? D'après ce que j'en comprends ça sert à
demander au compilo de laisser tomber toutes les optimisations sur
cet objet...
contient au moins un membre mutable, on peut le modifier
Par curiosité : quel est l'interret de "mutable" ?
Tout à fait. Quand l'objet est const (et non volatile)
Oh, tiens, bein tant qu'à y etre, qu'est-ce que ça signifie
exactement "volatile" ? D'après ce que j'en comprends ça sert à
demander au compilo de laisser tomber toutes les optimisations sur
cet objet...
contient au moins un membre mutable, on peut le modifier
Par curiosité : quel est l'interret de "mutable" ?
Tout à fait. Quand l'objet est const (et non volatile)
Oh, tiens, bein tant qu'à y etre, qu'est-ce que ça signifie
exactement "volatile" ? D'après ce que j'en comprends ça sert à
demander au compilo de laisser tomber toutes les optimisations sur cet
objet...
contient au moins un membre mutable, on peut le modifier
Par curiosité : quel est l'interret de "mutable" ?
Tout à fait. Quand l'objet est const (et non volatile)
Oh, tiens, bein tant qu'à y etre, qu'est-ce que ça signifie
exactement "volatile" ? D'après ce que j'en comprends ça sert à
demander au compilo de laisser tomber toutes les optimisations sur cet
objet...
contient au moins un membre mutable, on peut le modifier
Par curiosité : quel est l'interret de "mutable" ?
Tout à fait. Quand l'objet est const (et non volatile)
Oh, tiens, bein tant qu'à y etre, qu'est-ce que ça signifie
exactement "volatile" ? D'après ce que j'en comprends ça sert à
demander au compilo de laisser tomber toutes les optimisations sur cet
objet...
contient au moins un membre mutable, on peut le modifier
Par curiosité : quel est l'interret de "mutable" ?
Tout à fait. Quand l'objet est const (et non volatile)
Oh, tiens, bein tant qu'à y etre, qu'est-ce que ça signifie
exactement "volatile" ? D'après ce que j'en comprends ça sert
à demander au compilo de laisser tomber toutes les
optimisations sur cet objet...
Pas tout à fait -- ce que tu as écrit n'est pas du C++
légal,
Je supposes que ce qui manque pour que ce soit légal, c'est
une initialisation de mes vectors avec, disons 2 valeurs par
défaut ?
Mais je suis curieux à ce que tu pensais faire dans ton
exemple.
Rien de particulier, c'etait juste histoire d'avoir des
pointeurs sur des trucs un peu compliqués... Mais ça tombait
plutot bien, comme ça, ça t'a donné l'occasion de me rappeller
que la notation [] était quelque peu trompeuse ;)
contient au moins un membre mutable, on peut le modifier
Par curiosité : quel est l'interret de "mutable" ?
Tout à fait. Quand l'objet est const (et non volatile)
Oh, tiens, bein tant qu'à y etre, qu'est-ce que ça signifie
exactement "volatile" ? D'après ce que j'en comprends ça sert
à demander au compilo de laisser tomber toutes les
optimisations sur cet objet...
Pas tout à fait -- ce que tu as écrit n'est pas du C++
légal,
Je supposes que ce qui manque pour que ce soit légal, c'est
une initialisation de mes vectors avec, disons 2 valeurs par
défaut ?
Mais je suis curieux à ce que tu pensais faire dans ton
exemple.
Rien de particulier, c'etait juste histoire d'avoir des
pointeurs sur des trucs un peu compliqués... Mais ça tombait
plutot bien, comme ça, ça t'a donné l'occasion de me rappeller
que la notation [] était quelque peu trompeuse ;)
contient au moins un membre mutable, on peut le modifier
Par curiosité : quel est l'interret de "mutable" ?
Tout à fait. Quand l'objet est const (et non volatile)
Oh, tiens, bein tant qu'à y etre, qu'est-ce que ça signifie
exactement "volatile" ? D'après ce que j'en comprends ça sert
à demander au compilo de laisser tomber toutes les
optimisations sur cet objet...
Pas tout à fait -- ce que tu as écrit n'est pas du C++
légal,
Je supposes que ce qui manque pour que ce soit légal, c'est
une initialisation de mes vectors avec, disons 2 valeurs par
défaut ?
Mais je suis curieux à ce que tu pensais faire dans ton
exemple.
Rien de particulier, c'etait juste histoire d'avoir des
pointeurs sur des trucs un peu compliqués... Mais ça tombait
plutot bien, comme ça, ça t'a donné l'occasion de me rappeller
que la notation [] était quelque peu trompeuse ;)
contient au moins un membre mutable, on peut le modifier
Par curiosité : quel est l'interret de "mutable" ?
il n'y a aucun cas où tu risques de l'utiliser ou de le voir (sauf peut -être dans
un handleur de signal, et encore).
Je n'ai encore jamais touché à la programmation avec des thread, mais
A *p = new std::vector< A >() ;
''O_o J'ai vraiment ecrit ça ! Oups, la métabourde :D
il n'y a aucun cas où tu risques de l'utiliser ou de le voir (sauf peut -être dans
un handleur de signal, et encore).
Je n'ai encore jamais touché à la programmation avec des thread, mais
A *p = new std::vector< A >() ;
''O_o J'ai vraiment ecrit ça ! Oups, la métabourde :D
il n'y a aucun cas où tu risques de l'utiliser ou de le voir (sauf peut -être dans
un handleur de signal, et encore).
Je n'ai encore jamais touché à la programmation avec des thread, mais
A *p = new std::vector< A >() ;
''O_o J'ai vraiment ecrit ça ! Oups, la métabourde :D