b.) pourquoi a t'on décidé que ça fonctionnerait pas sur des
types tout betes ? où est le problème dans l'ecriture const_cast<A> ?
const A a;
const_cast<A&>(a).f();
a.) la notation const_cast<A&> pour 'moralement' signifier
const_cast<A> me trouble un peu...
y'a un truc que je vois pas ?
b.) si je commente la ligne marquée d'une atérisque (*), ça ne
compile pas : g++ prétend que je n'initialise pas mon "const A a;"...
Y'a pas de constructeur (vide) par défaut ? M'aurait-t'on menti ?
b.) pourquoi a t'on décidé que ça fonctionnerait pas sur des
types tout betes ? où est le problème dans l'ecriture const_cast<A> ?
const A a;
const_cast<A&>(a).f();
a.) la notation const_cast<A&> pour 'moralement' signifier
const_cast<A> me trouble un peu...
y'a un truc que je vois pas ?
b.) si je commente la ligne marquée d'une atérisque (*), ça ne
compile pas : g++ prétend que je n'initialise pas mon "const A a;"...
Y'a pas de constructeur (vide) par défaut ? M'aurait-t'on menti ?
b.) pourquoi a t'on décidé que ça fonctionnerait pas sur des
types tout betes ? où est le problème dans l'ecriture const_cast<A> ?
const A a;
const_cast<A&>(a).f();
a.) la notation const_cast<A&> pour 'moralement' signifier
const_cast<A> me trouble un peu...
y'a un truc que je vois pas ?
b.) si je commente la ligne marquée d'une atérisque (*), ça ne
compile pas : g++ prétend que je n'initialise pas mon "const A a;"...
Y'a pas de constructeur (vide) par défaut ? M'aurait-t'on menti ?
void f1() {
int j=2; // 1
const int i=j; // 2
std::cout<<i<<" "; // 3
const_cast<int&>(i)=3; // 4
Par contre si je commentes la ligne 1, et que dans la ligne 2
j'initialise i avec "2" au lieu de "j"... Bein là mon programme me
sort "2 2" 0_o
C'est normal ?
void f1() {
int j=2; // 1
const int i=j; // 2
std::cout<<i<<" "; // 3
const_cast<int&>(i)=3; // 4
Par contre si je commentes la ligne 1, et que dans la ligne 2
j'initialise i avec "2" au lieu de "j"... Bein là mon programme me
sort "2 2" 0_o
C'est normal ?
void f1() {
int j=2; // 1
const int i=j; // 2
std::cout<<i<<" "; // 3
const_cast<int&>(i)=3; // 4
Par contre si je commentes la ligne 1, et que dans la ligne 2
j'initialise i avec "2" au lieu de "j"... Bein là mon programme me
sort "2 2" 0_o
C'est normal ?
Si tu veux pouvoir le modifier quand même, tu dois le transformer en
un "A*", avec const_cast<>.
Si tu veux pouvoir le modifier quand même, tu dois le transformer en
un "A*", avec const_cast<>.
Si tu veux pouvoir le modifier quand même, tu dois le transformer en
un "A*", avec const_cast<>.
Si tu veux pouvoir le modifier quand même, tu dois le transformer en
un "A*", avec const_cast<>.
Si tu veux pouvoir le modifier quand même, tu dois le transformer en
un "A*", avec const_cast<>.
Si tu veux pouvoir le modifier quand même, tu dois le transformer en
un "A*", avec const_cast<>.
Je complètes le mail précédent avec un autre comportement que
je ne comprends pas
3.) encore un exemple... Avec un comportent bizarre
void f1() {
int j=2; // 1
const int i=j; // 2
std::cout<<i<<" "; // 3
const_cast<int&>(i)=3; // 4
std::cout<<i<<std::endl; // 5
}
int main(void){f1();return 0;};
en sortie j'ai bien du "2 3" comme je m'y attend. Par contre
si je commentes la ligne 1, et que dans la ligne 2
j'initialise i avec "2" au lieu de "j"... Bein là mon
programme me sort "2 2" 0_o
C'est normal ?
Je complètes le mail précédent avec un autre comportement que
je ne comprends pas
3.) encore un exemple... Avec un comportent bizarre
void f1() {
int j=2; // 1
const int i=j; // 2
std::cout<<i<<" "; // 3
const_cast<int&>(i)=3; // 4
std::cout<<i<<std::endl; // 5
}
int main(void){f1();return 0;};
en sortie j'ai bien du "2 3" comme je m'y attend. Par contre
si je commentes la ligne 1, et que dans la ligne 2
j'initialise i avec "2" au lieu de "j"... Bein là mon
programme me sort "2 2" 0_o
C'est normal ?
Je complètes le mail précédent avec un autre comportement que
je ne comprends pas
3.) encore un exemple... Avec un comportent bizarre
void f1() {
int j=2; // 1
const int i=j; // 2
std::cout<<i<<" "; // 3
const_cast<int&>(i)=3; // 4
std::cout<<i<<std::endl; // 5
}
int main(void){f1();return 0;};
en sortie j'ai bien du "2 3" comme je m'y attend. Par contre
si je commentes la ligne 1, et que dans la ligne 2
j'initialise i avec "2" au lieu de "j"... Bein là mon
programme me sort "2 2" 0_o
C'est normal ?
Tu as menti au compilateur ; il prend sa revanche.
Je n'ai pas voulu cela ! :D
Il ne s'agit pas de ça. Tu veux appeler une fonction sur a, et pas une
copie. Donc, tu dois prendre une référence sur a (ou un pointeur),
modifier ("hacker") cette référence en une référence sur un objet
non-const, et enfin appeler f().
Compris
const A a;
static_cast<A>(a).f(); ---> Appelle f() sur une copie de a.
'O_o ...OK (dieu que l'apprentissage va etre long :( )
En fait, const_cast<> sert à appeler des fonctions déclarées non-co nst
à tort.
Si je comprends bien, on ne devrait jamais avoir à tuliser ce type de
Tu as menti au compilateur ; il prend sa revanche.
Je n'ai pas voulu cela ! :D
Il ne s'agit pas de ça. Tu veux appeler une fonction sur a, et pas une
copie. Donc, tu dois prendre une référence sur a (ou un pointeur),
modifier ("hacker") cette référence en une référence sur un objet
non-const, et enfin appeler f().
Compris
const A a;
static_cast<A>(a).f(); ---> Appelle f() sur une copie de a.
'O_o ...OK (dieu que l'apprentissage va etre long :( )
En fait, const_cast<> sert à appeler des fonctions déclarées non-co nst
à tort.
Si je comprends bien, on ne devrait jamais avoir à tuliser ce type de
Tu as menti au compilateur ; il prend sa revanche.
Je n'ai pas voulu cela ! :D
Il ne s'agit pas de ça. Tu veux appeler une fonction sur a, et pas une
copie. Donc, tu dois prendre une référence sur a (ou un pointeur),
modifier ("hacker") cette référence en une référence sur un objet
non-const, et enfin appeler f().
Compris
const A a;
static_cast<A>(a).f(); ---> Appelle f() sur une copie de a.
'O_o ...OK (dieu que l'apprentissage va etre long :( )
En fait, const_cast<> sert à appeler des fonctions déclarées non-co nst
à tort.
Si je comprends bien, on ne devrait jamais avoir à tuliser ce type de
@Fabien
Je ne connaissais pas la notation "A const *p"... ça a l'air d'etre
pareil que "const A *p"...
En fait, const_cast<> sert à appeler des fonctions déclarées non-const
à tort.
Si je comprends bien, on ne devrait jamais avoir à tuliser ce type de
casts...
@Fabien
Je ne connaissais pas la notation "A const *p"... ça a l'air d'etre
pareil que "const A *p"...
En fait, const_cast<> sert à appeler des fonctions déclarées non-const
à tort.
Si je comprends bien, on ne devrait jamais avoir à tuliser ce type de
casts...
@Fabien
Je ne connaissais pas la notation "A const *p"... ça a l'air d'etre
pareil que "const A *p"...
En fait, const_cast<> sert à appeler des fonctions déclarées non-const
à tort.
Si je comprends bien, on ne devrait jamais avoir à tuliser ce type de
casts...
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.
Except that any class member declared mutable (7.1.1) can be modified, an y attempt to modify a const
object during its lifetime (3.8) results in undefined behavior.
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.
Except that any class member declared mutable (7.1.1) can be modified, an y attempt to modify a const
object during its lifetime (3.8) results in undefined behavior.
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.
Except that any class member declared mutable (7.1.1) can be modified, an y attempt to modify a const
object during its lifetime (3.8) results in undefined behavior.
@kanzeTu as menti au compilateur ; il prend sa revanche.
Je n'ai pas voulu cela ! :D
Au passage j'esquisse une réponse à ma question 1.b : les
objets consts peuvent faire l'objet d'optimisations du
compilo...
On ne peut donc pas les modifier simplement. Par contre, les
pointeurs et autres références adressent toujours une adresse
mémoire où on est certain de trouver l'objet, et donc de
pouvoir le modifier.
Le langage permet donc ce genre de modifs pour peu que le
codeur précise qu'il sait ce qu'il fait : en "déconstant"
@Fabien
Je ne connaissais pas la notation "A const *p"... ça a l'air
d'etre pareil que "const A *p"...
Il ne s'agit pas de ça. Tu veux appeler une fonction sur a,
et pas une copie. Donc, tu dois prendre une référence sur a
(ou un pointeur), modifier ("hacker") cette référence en une
référence sur un objet non-const, et enfin appeler f().
Comprisconst A a;
static_cast<A>(a).f(); ---> Appelle f() sur une copie de a.
'O_o ...OK (dieu que l'apprentissage va etre long :( )En fait, const_cast<> sert à appeler des fonctions déclarées
non-const à tort.
Si je comprends bien, on ne devrait jamais avoir à tuliser ce
type de casts...
@kanze
Tu as menti au compilateur ; il prend sa revanche.
Je n'ai pas voulu cela ! :D
Au passage j'esquisse une réponse à ma question 1.b : les
objets consts peuvent faire l'objet d'optimisations du
compilo...
On ne peut donc pas les modifier simplement. Par contre, les
pointeurs et autres références adressent toujours une adresse
mémoire où on est certain de trouver l'objet, et donc de
pouvoir le modifier.
Le langage permet donc ce genre de modifs pour peu que le
codeur précise qu'il sait ce qu'il fait : en "déconstant"
@Fabien
Je ne connaissais pas la notation "A const *p"... ça a l'air
d'etre pareil que "const A *p"...
Il ne s'agit pas de ça. Tu veux appeler une fonction sur a,
et pas une copie. Donc, tu dois prendre une référence sur a
(ou un pointeur), modifier ("hacker") cette référence en une
référence sur un objet non-const, et enfin appeler f().
Compris
const A a;
static_cast<A>(a).f(); ---> Appelle f() sur une copie de a.
'O_o ...OK (dieu que l'apprentissage va etre long :( )
En fait, const_cast<> sert à appeler des fonctions déclarées
non-const à tort.
Si je comprends bien, on ne devrait jamais avoir à tuliser ce
type de casts...
@kanzeTu as menti au compilateur ; il prend sa revanche.
Je n'ai pas voulu cela ! :D
Au passage j'esquisse une réponse à ma question 1.b : les
objets consts peuvent faire l'objet d'optimisations du
compilo...
On ne peut donc pas les modifier simplement. Par contre, les
pointeurs et autres références adressent toujours une adresse
mémoire où on est certain de trouver l'objet, et donc de
pouvoir le modifier.
Le langage permet donc ce genre de modifs pour peu que le
codeur précise qu'il sait ce qu'il fait : en "déconstant"
@Fabien
Je ne connaissais pas la notation "A const *p"... ça a l'air
d'etre pareil que "const A *p"...
Il ne s'agit pas de ça. Tu veux appeler une fonction sur a,
et pas une copie. Donc, tu dois prendre une référence sur a
(ou un pointeur), modifier ("hacker") cette référence en une
référence sur un objet non-const, et enfin appeler f().
Comprisconst A a;
static_cast<A>(a).f(); ---> Appelle f() sur une copie de a.
'O_o ...OK (dieu que l'apprentissage va etre long :( )En fait, const_cast<> sert à appeler des fonctions déclarées
non-const à tort.
Si je comprends bien, on ne devrait jamais avoir à tuliser ce
type de casts...