Y'a des faux copilos et du faux code maintenant ? Whouaa,
j'apprend quelque chose tous les jours. Merci Sylvain.
tu as mal lu / compris -- il y a l'approche théorique cadré et
décrit par la norme et il y a l'expérience (la vraie vie).
et pour résumer les 2 pts: je me cogne de savoir ce qu'un
compilo que je n'utiliserais jamais estime indéfini.
Tu n'utilises aucun compilateur ? Car c'est, à ma
connaîssance, un comportement indéfini dans tous les
compilateurs.
ta connaissance n'est donc pas universelle.
Une référence ne change pas d'identité.
pas spontanément mais on peut lui faire changer.
Comme James l'a dit et répété, le compilateur a totalement
le droit d'ignorer et optimiser (lire supprimer) le test
"if(&ref != NULL)" car il "sait" à l'avance que c'est
"impossible".
3ième répet.: "tester cette valeur ne conduira pas à un code
très clean mais bon ..."
int& r = *(int*)0;
Quelle est l'utilité de r ?
là ici ? j'en ai aucune idée.Plus sérieusement, dans le cas du noeud de btree, qu'est-ce
qui empêche d'utiliser this plutôt que NULL. C'est permi par
la norme et on obtient le résultat voulu.
perso, j'utiliserais (pour un noeud) des ptr et non des refs...
Y'a des faux copilos et du faux code maintenant ? Whouaa,
j'apprend quelque chose tous les jours. Merci Sylvain.
tu as mal lu / compris -- il y a l'approche théorique cadré et
décrit par la norme et il y a l'expérience (la vraie vie).
et pour résumer les 2 pts: je me cogne de savoir ce qu'un
compilo que je n'utiliserais jamais estime indéfini.
Tu n'utilises aucun compilateur ? Car c'est, à ma
connaîssance, un comportement indéfini dans tous les
compilateurs.
ta connaissance n'est donc pas universelle.
Une référence ne change pas d'identité.
pas spontanément mais on peut lui faire changer.
Comme James l'a dit et répété, le compilateur a totalement
le droit d'ignorer et optimiser (lire supprimer) le test
"if(&ref != NULL)" car il "sait" à l'avance que c'est
"impossible".
3ième répet.: "tester cette valeur ne conduira pas à un code
très clean mais bon ..."
int& r = *(int*)0;
Quelle est l'utilité de r ?
là ici ? j'en ai aucune idée.
Plus sérieusement, dans le cas du noeud de btree, qu'est-ce
qui empêche d'utiliser this plutôt que NULL. C'est permi par
la norme et on obtient le résultat voulu.
perso, j'utiliserais (pour un noeud) des ptr et non des refs...
Y'a des faux copilos et du faux code maintenant ? Whouaa,
j'apprend quelque chose tous les jours. Merci Sylvain.
tu as mal lu / compris -- il y a l'approche théorique cadré et
décrit par la norme et il y a l'expérience (la vraie vie).
et pour résumer les 2 pts: je me cogne de savoir ce qu'un
compilo que je n'utiliserais jamais estime indéfini.
Tu n'utilises aucun compilateur ? Car c'est, à ma
connaîssance, un comportement indéfini dans tous les
compilateurs.
ta connaissance n'est donc pas universelle.
Une référence ne change pas d'identité.
pas spontanément mais on peut lui faire changer.
Comme James l'a dit et répété, le compilateur a totalement
le droit d'ignorer et optimiser (lire supprimer) le test
"if(&ref != NULL)" car il "sait" à l'avance que c'est
"impossible".
3ième répet.: "tester cette valeur ne conduira pas à un code
très clean mais bon ..."
int& r = *(int*)0;
Quelle est l'utilité de r ?
là ici ? j'en ai aucune idée.Plus sérieusement, dans le cas du noeud de btree, qu'est-ce
qui empêche d'utiliser this plutôt que NULL. C'est permi par
la norme et on obtient le résultat voulu.
perso, j'utiliserais (pour un noeud) des ptr et non des refs...
"kanze" writes:
[...]
| > pour qui écrit un sample jamais publié (surtout pas utilisé)
| > c'est surement d'une haute importance; quand on est derrière
| > un vrai compilo pour du vrai code, le comportement est tout à
| > fait complètement défini.
|
| Avec le compilateur CenterLine, oui. Il est garanti de provoquer
| un message d'erreur. Avec les autres compilateurs, je ne sais
| pas. Je ne vois rien de garantie dans la documentation de Sun
| CC, ni dans celle de g++. (Je n'ai rien vu dans la documentation
| de VC++ non plus, mais je ne l'ai pas tout lue.)
Depuis des années, GCC exploite activement ces genres de
fonctionnement indéfini : si tu déréférences un pointeur, GCC en
déduit qu'il n'est pas nul (tu n'aurais pas dû le faire sinon) ; par
conséquent, l'optimizateur va virer des codes et autres choses sur la
base de cette inférence.
"kanze" <kanze@gabi-soft.fr> writes:
[...]
| > pour qui écrit un sample jamais publié (surtout pas utilisé)
| > c'est surement d'une haute importance; quand on est derrière
| > un vrai compilo pour du vrai code, le comportement est tout à
| > fait complètement défini.
|
| Avec le compilateur CenterLine, oui. Il est garanti de provoquer
| un message d'erreur. Avec les autres compilateurs, je ne sais
| pas. Je ne vois rien de garantie dans la documentation de Sun
| CC, ni dans celle de g++. (Je n'ai rien vu dans la documentation
| de VC++ non plus, mais je ne l'ai pas tout lue.)
Depuis des années, GCC exploite activement ces genres de
fonctionnement indéfini : si tu déréférences un pointeur, GCC en
déduit qu'il n'est pas nul (tu n'aurais pas dû le faire sinon) ; par
conséquent, l'optimizateur va virer des codes et autres choses sur la
base de cette inférence.
"kanze" writes:
[...]
| > pour qui écrit un sample jamais publié (surtout pas utilisé)
| > c'est surement d'une haute importance; quand on est derrière
| > un vrai compilo pour du vrai code, le comportement est tout à
| > fait complètement défini.
|
| Avec le compilateur CenterLine, oui. Il est garanti de provoquer
| un message d'erreur. Avec les autres compilateurs, je ne sais
| pas. Je ne vois rien de garantie dans la documentation de Sun
| CC, ni dans celle de g++. (Je n'ai rien vu dans la documentation
| de VC++ non plus, mais je ne l'ai pas tout lue.)
Depuis des années, GCC exploite activement ces genres de
fonctionnement indéfini : si tu déréférences un pointeur, GCC en
déduit qu'il n'est pas nul (tu n'aurais pas dû le faire sinon) ; par
conséquent, l'optimizateur va virer des codes et autres choses sur la
base de cette inférence.