(posté ailleurs mais sans réponse, je tente ma chance ici, étant plus
porté sur le C++)
dans http://www.objectmentor.com/resources/articles/lsp.pdf à propos du
LSP, l'exemple est donné à base d'un Square héritant d'un Rectangle (à
ne pas faire donc)
Auriez-vous une idée d'exemple qui poserait problème pour le cas d'un
Rectangle héritant d'un Square (ou si, à votre avis, le deuxième exemple
que j'ai codé suffit)?
Voici l'argument mis en avant dans l'article (en C++), je reprends
l'exemple donné dans l'article original :
(Un Square héritant d'un rectangle)
Le Wed, 25 Apr 2012 22:52:21 +0000 (UTC), Marc Espie écrivait :
In article <jn94np$pg1$, Marc Boyer wrote:
Le 25-04-2012, Marc Espie a écrit :
In article <4f97efe8$0$21490$, Laurent Georget wrote:
Mais est-ce qu'on ne devrait pas avoir moyen de "remplacer" un objet par un autre, au lieu de retourner un résultat ? Les langages objet que je connais (C++ et Java, et aussi partiellement OCaml) ne sont pas vraiment friands de ce genre de concepts.
En C++, tu peux faire ce que tu veux. Suffit de rajouter une couche d'abstraction, et tu peux tres bien avoir un objet qui contiendra au choix un Rectangle ou un Carre et qui mutera en fonction.
C'est pas "natif" au langage, mais il n'y a pas besoin, ca ne coutera rien au runtime (evidemment le compilo va morfler par contre).
Enfin, entre avec une méthode qui retourne un nouvel objet et une autre qui se modifie l'objet contenu, je ne vois pas de grande différence, hormis le fait de cacher le type au compilo.
Marc Boyer
Il n'y en a pas, j'en ai juste ma claque des gnagnagna habituels sur `ah ca je peux faire avec mon vrai langage objet'. Le truc bien avec C++, c'est qu'en vrai, ca ne t'impose a peu pres rien sur ce que tu fais, tu peux inventer la semantique que tu veux pour coller sur ta syntaxe.
(le truc pas bien, c'est que tu peux VRAIMENT faire ce que tu veux, meme et surtout si c'est n'importe quoi).
Ce n'est pas vraiment spécifique au C++. En C, c'est pareil. Et comme il y a de plus en plus de gens sur le marché qui ne savent pas programmer correctement (mais qui se figurent savoir), ce n'est pas vraiment prêt à s'arranger.
Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre l'entier 0 et le const char * NULL :-( ).
JKB
-- Si votre demande me parvient sur carte perforée, je titiouaillerai très volontiers une réponse... => http://grincheux.de-charybde-en-scylla.fr
Le Wed, 25 Apr 2012 22:52:21 +0000 (UTC),
Marc Espie <espie@lain.home> écrivait :
In article <jn94np$pg1$1@news.cict.fr>,
Marc Boyer <Marc.Boyer@cert.onera.fr.invalid> wrote:
Le 25-04-2012, Marc Espie <espie@lain.home> a écrit :
In article <4f97efe8$0$21490$ba4acef3@reader.news.orange.fr>,
Laurent Georget <laurent@lgeorget.eu> wrote:
Mais est-ce qu'on
ne devrait pas avoir moyen de "remplacer" un objet par un autre, au lieu
de retourner un résultat ? Les langages objet que je connais (C++ et
Java, et aussi partiellement OCaml) ne sont pas vraiment friands de ce
genre de concepts.
En C++, tu peux faire ce que tu veux. Suffit de rajouter une couche
d'abstraction, et tu peux tres bien avoir un objet qui contiendra au choix
un Rectangle ou un Carre et qui mutera en fonction.
C'est pas "natif" au langage, mais il n'y a pas besoin, ca ne coutera
rien au runtime (evidemment le compilo va morfler par contre).
Enfin, entre avec une méthode qui retourne un nouvel objet
et une autre qui se modifie l'objet contenu, je ne vois pas
de grande différence, hormis le fait de cacher le type
au compilo.
Marc Boyer
Il n'y en a pas, j'en ai juste ma claque des gnagnagna habituels sur
`ah ca je peux faire avec mon vrai langage objet'. Le truc bien avec C++,
c'est qu'en vrai, ca ne t'impose a peu pres rien sur ce que tu fais, tu
peux inventer la semantique que tu veux pour coller sur ta syntaxe.
(le truc pas bien, c'est que tu peux VRAIMENT faire ce que tu veux, meme
et surtout si c'est n'importe quoi).
Ce n'est pas vraiment spécifique au C++. En C, c'est pareil. Et
comme il y a de plus en plus de gens sur le marché qui ne savent pas
programmer correctement (mais qui se figurent savoir), ce n'est pas
vraiment prêt à s'arranger.
Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et
savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt
de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre
l'entier 0 et le const char * NULL :-( ).
JKB
--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Le Wed, 25 Apr 2012 22:52:21 +0000 (UTC), Marc Espie écrivait :
In article <jn94np$pg1$, Marc Boyer wrote:
Le 25-04-2012, Marc Espie a écrit :
In article <4f97efe8$0$21490$, Laurent Georget wrote:
Mais est-ce qu'on ne devrait pas avoir moyen de "remplacer" un objet par un autre, au lieu de retourner un résultat ? Les langages objet que je connais (C++ et Java, et aussi partiellement OCaml) ne sont pas vraiment friands de ce genre de concepts.
En C++, tu peux faire ce que tu veux. Suffit de rajouter une couche d'abstraction, et tu peux tres bien avoir un objet qui contiendra au choix un Rectangle ou un Carre et qui mutera en fonction.
C'est pas "natif" au langage, mais il n'y a pas besoin, ca ne coutera rien au runtime (evidemment le compilo va morfler par contre).
Enfin, entre avec une méthode qui retourne un nouvel objet et une autre qui se modifie l'objet contenu, je ne vois pas de grande différence, hormis le fait de cacher le type au compilo.
Marc Boyer
Il n'y en a pas, j'en ai juste ma claque des gnagnagna habituels sur `ah ca je peux faire avec mon vrai langage objet'. Le truc bien avec C++, c'est qu'en vrai, ca ne t'impose a peu pres rien sur ce que tu fais, tu peux inventer la semantique que tu veux pour coller sur ta syntaxe.
(le truc pas bien, c'est que tu peux VRAIMENT faire ce que tu veux, meme et surtout si c'est n'importe quoi).
Ce n'est pas vraiment spécifique au C++. En C, c'est pareil. Et comme il y a de plus en plus de gens sur le marché qui ne savent pas programmer correctement (mais qui se figurent savoir), ce n'est pas vraiment prêt à s'arranger.
Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre l'entier 0 et le const char * NULL :-( ).
JKB
-- Si votre demande me parvient sur carte perforée, je titiouaillerai très volontiers une réponse... => http://grincheux.de-charybde-en-scylla.fr
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0, je me demande si tu n'as pas trouve quelque chose de conforme, ou meme de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour eviter certains problemes, mais NULL ne peut pas -- encore? -- etre definit comme nullptr). Il y a des consequences "interessantes" avec la surcharge et les templates.
g++ donne un warning quand on utilise NULL dans des contextes non pointeurs, mais genere du code comme si c'etait 0 de specifie.
(En C NULL peut aussi etre definit comme (void*)0, c'est pas autorise en C++).
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index. html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0,
je me demande si tu n'as pas trouve quelque chose de conforme, ou meme
de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour
eviter certains problemes, mais NULL ne peut pas -- encore? -- etre
definit comme nullptr). Il y a des consequences "interessantes" avec la
surcharge et les templates.
g++ donne un warning quand on utilise NULL dans des contextes non
pointeurs, mais genere du code comme si c'etait 0 de specifie.
(En C NULL peut aussi etre definit comme (void*)0, c'est pas autorise en
C++).
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index. html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0, je me demande si tu n'as pas trouve quelque chose de conforme, ou meme de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour eviter certains problemes, mais NULL ne peut pas -- encore? -- etre definit comme nullptr). Il y a des consequences "interessantes" avec la surcharge et les templates.
g++ donne un warning quand on utilise NULL dans des contextes non pointeurs, mais genere du code comme si c'etait 0 de specifie.
(En C NULL peut aussi etre definit comme (void*)0, c'est pas autorise en C++).
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index. html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre l'entier 0 et le const char * NULL :-( ).
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0, je me demande si tu n'as pas trouve quelque chose de conforme, ou meme de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour eviter certains problemes, mais NULL ne peut pas -- encore? -- etre definit comme nullptr). Il y a des consequences "interessantes" avec la surcharge et les templates.
Sauf que même en forçant explicitement le type, le compilo n'en a rien à faire. Avoir une méthode foo(const char *p) et une seconde foo(int i) fait que foo(0) appelle la version cont char * même si je prends la peine de coller foo((int) 0). Ce qui est assez amusant de mon point de vue, c'est que foo(1) ne se pose pas la question (alors que j'ai au moins une architecture sous la main où NULL ne vaut pas 0). La solution pas élégante a été de rajouter une méthode pour gérer explicitement ce cas avec un argument supplémentaire. J'avoue, ce n'est pas propre.
g++ donne un warning quand on utilise NULL dans des contextes non pointeurs, mais genere du code comme si c'etait 0 de specifie.
Là, c'est l'inverse, et g++ ne râle pas (je compile toujours le C++ avec -Werror -Wall -Wextra).
JKB
-- Si votre demande me parvient sur carte perforée, je titiouaillerai très volontiers une réponse... => http://grincheux.de-charybde-en-scylla.fr
Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et
savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt
de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre
l'entier 0 et le const char * NULL :-( ).
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0,
je me demande si tu n'as pas trouve quelque chose de conforme, ou meme
de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour
eviter certains problemes, mais NULL ne peut pas -- encore? -- etre
definit comme nullptr). Il y a des consequences "interessantes" avec la
surcharge et les templates.
Sauf que même en forçant explicitement le type, le compilo n'en a
rien à faire. Avoir une méthode foo(const char *p) et une seconde
foo(int i) fait que foo(0) appelle la version cont char * même si je
prends la peine de coller foo((int) 0). Ce qui est assez amusant de
mon point de vue, c'est que foo(1) ne se pose pas la question (alors
que j'ai au moins une architecture sous la main où NULL ne vaut pas
0). La solution pas élégante a été de rajouter une méthode pour
gérer explicitement ce cas avec un argument supplémentaire. J'avoue,
ce n'est pas propre.
g++ donne un warning quand on utilise NULL dans des contextes non
pointeurs, mais genere du code comme si c'etait 0 de specifie.
Là, c'est l'inverse, et g++ ne râle pas (je compile toujours le C++
avec -Werror -Wall -Wextra).
JKB
--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre l'entier 0 et le const char * NULL :-( ).
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0, je me demande si tu n'as pas trouve quelque chose de conforme, ou meme de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour eviter certains problemes, mais NULL ne peut pas -- encore? -- etre definit comme nullptr). Il y a des consequences "interessantes" avec la surcharge et les templates.
Sauf que même en forçant explicitement le type, le compilo n'en a rien à faire. Avoir une méthode foo(const char *p) et une seconde foo(int i) fait que foo(0) appelle la version cont char * même si je prends la peine de coller foo((int) 0). Ce qui est assez amusant de mon point de vue, c'est que foo(1) ne se pose pas la question (alors que j'ai au moins une architecture sous la main où NULL ne vaut pas 0). La solution pas élégante a été de rajouter une méthode pour gérer explicitement ce cas avec un argument supplémentaire. J'avoue, ce n'est pas propre.
g++ donne un warning quand on utilise NULL dans des contextes non pointeurs, mais genere du code comme si c'etait 0 de specifie.
Là, c'est l'inverse, et g++ ne râle pas (je compile toujours le C++ avec -Werror -Wall -Wextra).
JKB
-- Si votre demande me parvient sur carte perforée, je titiouaillerai très volontiers une réponse... => http://grincheux.de-charybde-en-scylla.fr
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0, je me demande si tu n'as pas trouve quelque chose de conforme, ou meme de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour eviter certains problemes, mais NULL ne peut pas -- encore? -- etre definit comme nullptr). Il y a des consequences "interessantes" avec la surcharge et les templates.
affiche f(int) avec toutes celles que j'ai sous la main et que j'ai essayees.
Ce qui est assez amusant de mon point de vue, c'est que foo(1) ne se pose pas la question (alors que j'ai au moins une architecture sous la main où NULL ne vaut pas 0).
La representation physique n'a pas d'importance. Dans le code, une constante entiere de valeur 0 est un pointeur nul qui peut physiquement etre represente autrement qu'un int de valeur 0.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index. html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0,
je me demande si tu n'as pas trouve quelque chose de conforme, ou meme
de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour
eviter certains problemes, mais NULL ne peut pas -- encore? -- etre
definit comme nullptr). Il y a des consequences "interessantes" avec la
surcharge et les templates.
affiche f(int) avec toutes celles que j'ai sous la main et que j'ai
essayees.
Ce qui est assez amusant de
mon point de vue, c'est que foo(1) ne se pose pas la question (alors
que j'ai au moins une architecture sous la main où NULL ne vaut pas
0).
La representation physique n'a pas d'importance. Dans le code, une
constante entiere de valeur 0 est un pointeur nul qui peut physiquement
etre represente autrement qu'un int de valeur 0.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index. html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0, je me demande si tu n'as pas trouve quelque chose de conforme, ou meme de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour eviter certains problemes, mais NULL ne peut pas -- encore? -- etre definit comme nullptr). Il y a des consequences "interessantes" avec la surcharge et les templates.
affiche f(int) avec toutes celles que j'ai sous la main et que j'ai essayees.
Ce qui est assez amusant de mon point de vue, c'est que foo(1) ne se pose pas la question (alors que j'ai au moins une architecture sous la main où NULL ne vaut pas 0).
La representation physique n'a pas d'importance. Dans le code, une constante entiere de valeur 0 est un pointeur nul qui peut physiquement etre represente autrement qu'un int de valeur 0.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index. html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Marc Boyer
Le 25-04-2012, Marc Espie a écrit :
In article <jn94np$pg1$, Marc Boyer wrote:
Le 25-04-2012, Marc Espie a écrit :
In article <4f97efe8$0$21490$, Laurent Georget wrote:
Mais est-ce qu'on ne devrait pas avoir moyen de "remplacer" un objet par un autre, au lieu de retourner un résultat ? Les langages objet que je connais (C++ et Java, et aussi partiellement OCaml) ne sont pas vraiment friands de ce genre de concepts.
En C++, tu peux faire ce que tu veux. Suffit de rajouter une couche d'abstraction, et tu peux tres bien avoir un objet qui contiendra au choix un Rectangle ou un Carre et qui mutera en fonction.
C'est pas "natif" au langage, mais il n'y a pas besoin, ca ne coutera rien au runtime (evidemment le compilo va morfler par contre).
Enfin, entre avec une méthode qui retourne un nouvel objet et une autre qui se modifie l'objet contenu, je ne vois pas de grande différence, hormis le fait de cacher le type au compilo.
Il n'y en a pas, j'en ai juste ma claque des gnagnagna habituels sur `ah ca je peux faire avec mon vrai langage objet'. Le truc bien avec C++, c'est qu'en vrai, ca ne t'impose a peu pres rien sur ce que tu fais, tu peux inventer la semantique que tu veux pour coller sur ta syntaxe.
Après, il y a un système de type, qui permet de vérifier à la compilation que le typage est cohérent, mais qui impose de faire coincider l'intention du développeur et le système de type du langage, et ça impose de le connaitre.
Dans une système super dynamique où le compilo ne vérifie rien, la compilation est plus facile, et les éventuelles erreurs se chopent à l'exécution.
(le truc pas bien, c'est que tu peux VRAIMENT faire ce que tu veux, meme et surtout si c'est n'importe quoi).
Si c'est n'importe quoi, le système de type râle un peu quand même. Heureusement, il y a des cast qui permettent de faire taire le compilateur.
Marc Boyer -- À mesure que les inégalités regressent, les attentes se renforcent. François Dubet
Le 25-04-2012, Marc Espie <espie@lain.home> a écrit :
In article <jn94np$pg1$1@news.cict.fr>,
Marc Boyer <Marc.Boyer@cert.onera.fr.invalid> wrote:
Le 25-04-2012, Marc Espie <espie@lain.home> a écrit :
In article <4f97efe8$0$21490$ba4acef3@reader.news.orange.fr>,
Laurent Georget <laurent@lgeorget.eu> wrote:
Mais est-ce qu'on
ne devrait pas avoir moyen de "remplacer" un objet par un autre, au lieu
de retourner un résultat ? Les langages objet que je connais (C++ et
Java, et aussi partiellement OCaml) ne sont pas vraiment friands de ce
genre de concepts.
En C++, tu peux faire ce que tu veux. Suffit de rajouter une couche
d'abstraction, et tu peux tres bien avoir un objet qui contiendra au choix
un Rectangle ou un Carre et qui mutera en fonction.
C'est pas "natif" au langage, mais il n'y a pas besoin, ca ne coutera
rien au runtime (evidemment le compilo va morfler par contre).
Enfin, entre avec une méthode qui retourne un nouvel objet
et une autre qui se modifie l'objet contenu, je ne vois pas
de grande différence, hormis le fait de cacher le type
au compilo.
Il n'y en a pas, j'en ai juste ma claque des gnagnagna habituels sur
`ah ca je peux faire avec mon vrai langage objet'. Le truc bien avec C++,
c'est qu'en vrai, ca ne t'impose a peu pres rien sur ce que tu fais, tu
peux inventer la semantique que tu veux pour coller sur ta syntaxe.
Après, il y a un système de type, qui permet de vérifier à la compilation
que le typage est cohérent, mais qui impose de faire coincider l'intention
du développeur et le système de type du langage, et ça impose de le connaitre.
Dans une système super dynamique où le compilo ne vérifie rien,
la compilation est plus facile, et les éventuelles erreurs se chopent
à l'exécution.
(le truc pas bien, c'est que tu peux VRAIMENT faire ce que tu veux, meme
et surtout si c'est n'importe quoi).
Si c'est n'importe quoi, le système de type râle un peu quand même.
Heureusement, il y a des cast qui permettent de faire taire le
compilateur.
Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
In article <4f97efe8$0$21490$, Laurent Georget wrote:
Mais est-ce qu'on ne devrait pas avoir moyen de "remplacer" un objet par un autre, au lieu de retourner un résultat ? Les langages objet que je connais (C++ et Java, et aussi partiellement OCaml) ne sont pas vraiment friands de ce genre de concepts.
En C++, tu peux faire ce que tu veux. Suffit de rajouter une couche d'abstraction, et tu peux tres bien avoir un objet qui contiendra au choix un Rectangle ou un Carre et qui mutera en fonction.
C'est pas "natif" au langage, mais il n'y a pas besoin, ca ne coutera rien au runtime (evidemment le compilo va morfler par contre).
Enfin, entre avec une méthode qui retourne un nouvel objet et une autre qui se modifie l'objet contenu, je ne vois pas de grande différence, hormis le fait de cacher le type au compilo.
Il n'y en a pas, j'en ai juste ma claque des gnagnagna habituels sur `ah ca je peux faire avec mon vrai langage objet'. Le truc bien avec C++, c'est qu'en vrai, ca ne t'impose a peu pres rien sur ce que tu fais, tu peux inventer la semantique que tu veux pour coller sur ta syntaxe.
Après, il y a un système de type, qui permet de vérifier à la compilation que le typage est cohérent, mais qui impose de faire coincider l'intention du développeur et le système de type du langage, et ça impose de le connaitre.
Dans une système super dynamique où le compilo ne vérifie rien, la compilation est plus facile, et les éventuelles erreurs se chopent à l'exécution.
(le truc pas bien, c'est que tu peux VRAIMENT faire ce que tu veux, meme et surtout si c'est n'importe quoi).
Si c'est n'importe quoi, le système de type râle un peu quand même. Heureusement, il y a des cast qui permettent de faire taire le compilateur.
Marc Boyer -- À mesure que les inégalités regressent, les attentes se renforcent. François Dubet
Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre l'entier 0 et le const char * NULL :-( ).
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0, je me demande si tu n'as pas trouve quelque chose de conforme, ou meme de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour eviter certains problemes, mais NULL ne peut pas -- encore? -- etre definit comme nullptr). Il y a des consequences "interessantes" avec la surcharge et les templates.
Sauf que même en forçant explicitement le type, le compilo n'en a rien à faire. Avoir une méthode foo(const char *p) et une seconde foo(int i) fait que foo(0) appelle la version cont char *
Etrange.
même si je prends la peine de coller foo((int) 0).
affiche f(int) avec toutes celles que j'ai sous la main et que j'ai essayees.
Ce qui est assez amusant de mon point de vue, c'est que foo(1) ne se pose pas la question (alors que j'ai au moins une architecture sous la main où NULL ne vaut pas 0).
La representation physique n'a pas d'importance. Dans le code, une constante entiere de valeur 0 est un pointeur nul qui peut physiquement etre represente autrement qu'un int de valeur 0.
Nous sommes bien d'accord. Mais en l'occurrence, g++ se mélange les pinceaux...
Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et
savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt
de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre
l'entier 0 et le const char * NULL :-( ).
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0,
je me demande si tu n'as pas trouve quelque chose de conforme, ou meme
de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour
eviter certains problemes, mais NULL ne peut pas -- encore? -- etre
definit comme nullptr). Il y a des consequences "interessantes" avec la
surcharge et les templates.
Sauf que même en forçant explicitement le type, le compilo n'en a
rien à faire. Avoir une méthode foo(const char *p) et une seconde
foo(int i) fait que foo(0) appelle la version cont char *
Etrange.
même si je
prends la peine de coller foo((int) 0).
affiche f(int) avec toutes celles que j'ai sous la main et que j'ai
essayees.
Ce qui est assez amusant de
mon point de vue, c'est que foo(1) ne se pose pas la question (alors
que j'ai au moins une architecture sous la main où NULL ne vaut pas
0).
La representation physique n'a pas d'importance. Dans le code, une
constante entiere de valeur 0 est un pointeur nul qui peut physiquement
etre represente autrement qu'un int de valeur 0.
Nous sommes bien d'accord. Mais en l'occurrence, g++ se mélange les
pinceaux...
Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre l'entier 0 et le const char * NULL :-( ).
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0, je me demande si tu n'as pas trouve quelque chose de conforme, ou meme de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour eviter certains problemes, mais NULL ne peut pas -- encore? -- etre definit comme nullptr). Il y a des consequences "interessantes" avec la surcharge et les templates.
Sauf que même en forçant explicitement le type, le compilo n'en a rien à faire. Avoir une méthode foo(const char *p) et une seconde foo(int i) fait que foo(0) appelle la version cont char *
Etrange.
même si je prends la peine de coller foo((int) 0).
affiche f(int) avec toutes celles que j'ai sous la main et que j'ai essayees.
Ce qui est assez amusant de mon point de vue, c'est que foo(1) ne se pose pas la question (alors que j'ai au moins une architecture sous la main où NULL ne vaut pas 0).
La representation physique n'a pas d'importance. Dans le code, une constante entiere de valeur 0 est un pointeur nul qui peut physiquement etre represente autrement qu'un int de valeur 0.
Nous sommes bien d'accord. Mais en l'occurrence, g++ se mélange les pinceaux...
JKB
ld
On 26 avr, 09:54, Jean-Marc Bourguet wrote:
JKB writes: > Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et > savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt > de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre > l'entier 0 et le const char * NULL :-( ).
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0, je me demande si tu n'as pas trouve quelque chose de conforme, ou meme de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour eviter certains problemes, mais NULL ne peut pas -- encore? -- etre definit comme nullptr). Il y a des consequences "interessantes" avec l a surcharge et les templates.
g++ donne un warning quand on utilise NULL dans des contextes non pointeurs, mais genere du code comme si c'etait 0 de specifie.
(En C NULL peut aussi etre definit comme (void*)0, c'est pas autorise en C++).
mais necessaire pour les appels de fonctions variadic...
a+, laurent.
On 26 avr, 09:54, Jean-Marc Bourguet <j...@bourguet.org> wrote:
JKB <j...@koenigsberg.invalid> writes:
> Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et
> savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt
> de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre
> l'entier 0 et le const char * NULL :-( ).
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0,
je me demande si tu n'as pas trouve quelque chose de conforme, ou meme
de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour
eviter certains problemes, mais NULL ne peut pas -- encore? -- etre
definit comme nullptr). Il y a des consequences "interessantes" avec l a
surcharge et les templates.
g++ donne un warning quand on utilise NULL dans des contextes non
pointeurs, mais genere du code comme si c'etait 0 de specifie.
(En C NULL peut aussi etre definit comme (void*)0, c'est pas autorise en
C++).
mais necessaire pour les appels de fonctions variadic...
JKB writes: > Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et > savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt > de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre > l'entier 0 et le const char * NULL :-( ).
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0, je me demande si tu n'as pas trouve quelque chose de conforme, ou meme de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour eviter certains problemes, mais NULL ne peut pas -- encore? -- etre definit comme nullptr). Il y a des consequences "interessantes" avec l a surcharge et les templates.
g++ donne un warning quand on utilise NULL dans des contextes non pointeurs, mais genere du code comme si c'etait 0 de specifie.
(En C NULL peut aussi etre definit comme (void*)0, c'est pas autorise en C++).
mais necessaire pour les appels de fonctions variadic...
a+, laurent.
Jean-Marc Bourguet
ld writes:
(En C NULL peut aussi etre definit comme (void*)0, c'est pas autorise en C++).
mais necessaire pour les appels de fonctions variadic...
Vu qu'en C le cast est autorise mais pas obligatoire, la situation est la meme, en cas d'apple a une fonction variadique (ou une fonctions sans prototype en C), l'appelant doit faire attention aux parametres.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
ld <laurent.deniau@gmail.com> writes:
(En C NULL peut aussi etre definit comme (void*)0, c'est pas autorise en
C++).
mais necessaire pour les appels de fonctions variadic...
Vu qu'en C le cast est autorise mais pas obligatoire, la situation est
la meme, en cas d'apple a une fonction variadique (ou une fonctions sans
prototype en C), l'appelant doit faire attention aux parametres.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
(En C NULL peut aussi etre definit comme (void*)0, c'est pas autorise en C++).
mais necessaire pour les appels de fonctions variadic...
Vu qu'en C le cast est autorise mais pas obligatoire, la situation est la meme, en cas d'apple a une fonction variadique (ou une fonctions sans prototype en C), l'appelant doit faire attention aux parametres.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Lucas Levrel
Le 26 avril 2012, JKB a écrit :
Sauf que même en forçant explicitement le type, le compilo n'en a rien à faire. Avoir une méthode foo(const char *p) et une seconde foo(int i) fait que foo(0) appelle la version cont char * même si je prends la peine de coller foo((int) 0). La solution pas élégante a été de rajouter une méthode pour gérer explicitement ce cas avec un argument supplémentaire. J'avoue, ce n'est pas propre.
Pour reprendre l'ECM de Jean-Marc Bourguet :
#include <iostream>
struct C { void f(int) { std::cout << "f(int)n"; }
C'est peut-être moins clair mais ça éviterait de définir une méthode supplémentaire.
-- LL
Le 26 avril 2012, JKB a écrit :
Sauf que même en forçant explicitement le type, le compilo n'en a
rien à faire. Avoir une méthode foo(const char *p) et une seconde
foo(int i) fait que foo(0) appelle la version cont char * même si je
prends la peine de coller foo((int) 0).
La solution pas élégante a été de rajouter une méthode pour
gérer explicitement ce cas avec un argument supplémentaire. J'avoue,
ce n'est pas propre.
Pour reprendre l'ECM de Jean-Marc Bourguet :
#include <iostream>
struct C {
void f(int) {
std::cout << "f(int)n";
}
Sauf que même en forçant explicitement le type, le compilo n'en a rien à faire. Avoir une méthode foo(const char *p) et une seconde foo(int i) fait que foo(0) appelle la version cont char * même si je prends la peine de coller foo((int) 0). La solution pas élégante a été de rajouter une méthode pour gérer explicitement ce cas avec un argument supplémentaire. J'avoue, ce n'est pas propre.
Pour reprendre l'ECM de Jean-Marc Bourguet :
#include <iostream>
struct C { void f(int) { std::cout << "f(int)n"; }
C'est peut-être moins clair mais ça éviterait de définir une méthode supplémentaire.
-- LL
espie
In article , ld wrote:
On 26 avr, 09:54, Jean-Marc Bourguet wrote:
JKB writes: > Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et > savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt > de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre > l'entier 0 et le const char * NULL :-( ).
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0, je me demande si tu n'as pas trouve quelque chose de conforme, ou meme de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour eviter certains problemes, mais NULL ne peut pas -- encore? -- etre definit comme nullptr). Il y a des consequences "interessantes" avec la surcharge et les templates.
g++ donne un warning quand on utilise NULL dans des contextes non pointeurs, mais genere du code comme si c'etait 0 de specifie.
(En C NULL peut aussi etre definit comme (void*)0, c'est pas autorise en C++).
mais necessaire pour les appels de fonctions variadic...
a+, laurent.
Pour ceux qui ne l'ont pas vu, je recommande le talk d'Alexandrescu a "Going Native 2012" sur les template variadiques, ou il arrive a refaire un printf() totalement type-checked en C++ pur.
Pas encore eu l'occasion de pratiquer suffisamment, mais le perfect-forwarding permis par les rvalue references (enfin, en passant par std::forward pour faire simple) et les template variadiques, c'est totalement bluffant.
Le template<typename ...Args> void f(Args&& ...args) { g(std::forward<Args>(args)...); }
meme si c'est un truc que j'utilise sans arret en perl, je ne m'attendais vraiment pas a le retrouver en C++ 2011.
In article <cde9f2d5-9ff3-4d94-9e09-da5bd6a1ef77@m31g2000vbn.googlegroups.com>,
ld <laurent.deniau@gmail.com> wrote:
On 26 avr, 09:54, Jean-Marc Bourguet <j...@bourguet.org> wrote:
JKB <j...@koenigsberg.invalid> writes:
> Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et
> savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt
> de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre
> l'entier 0 et le const char * NULL :-( ).
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0,
je me demande si tu n'as pas trouve quelque chose de conforme, ou meme
de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour
eviter certains problemes, mais NULL ne peut pas -- encore? -- etre
definit comme nullptr). Il y a des consequences "interessantes" avec la
surcharge et les templates.
g++ donne un warning quand on utilise NULL dans des contextes non
pointeurs, mais genere du code comme si c'etait 0 de specifie.
(En C NULL peut aussi etre definit comme (void*)0, c'est pas autorise en
C++).
mais necessaire pour les appels de fonctions variadic...
a+, laurent.
Pour ceux qui ne l'ont pas vu, je recommande le talk d'Alexandrescu
a "Going Native 2012" sur les template variadiques, ou il arrive a refaire
un printf() totalement type-checked en C++ pur.
Pas encore eu l'occasion de pratiquer suffisamment, mais le perfect-forwarding
permis par les rvalue references (enfin, en passant par std::forward pour
faire simple) et les template variadiques, c'est totalement bluffant.
Le
template<typename ...Args>
void f(Args&& ...args)
{ g(std::forward<Args>(args)...); }
meme si c'est un truc que j'utilise sans arret en perl, je ne m'attendais
vraiment pas a le retrouver en C++ 2011.
JKB writes: > Pour coder en C ou C++, il faut avoir une bonne hygiène de vie et > savoir ce que l'on fait (et avoir un compilo C++ à peu près exempt > de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre > l'entier 0 et le const char * NULL :-( ).
Vu qu'en C++ NULL doit etre defini a une constante entiere de valeur 0, je me demande si tu n'as pas trouve quelque chose de conforme, ou meme de specifie (j'ai pas dit de desirable, C++11 definit un nullptr, pour eviter certains problemes, mais NULL ne peut pas -- encore? -- etre definit comme nullptr). Il y a des consequences "interessantes" avec la surcharge et les templates.
g++ donne un warning quand on utilise NULL dans des contextes non pointeurs, mais genere du code comme si c'etait 0 de specifie.
(En C NULL peut aussi etre definit comme (void*)0, c'est pas autorise en C++).
mais necessaire pour les appels de fonctions variadic...
a+, laurent.
Pour ceux qui ne l'ont pas vu, je recommande le talk d'Alexandrescu a "Going Native 2012" sur les template variadiques, ou il arrive a refaire un printf() totalement type-checked en C++ pur.
Pas encore eu l'occasion de pratiquer suffisamment, mais le perfect-forwarding permis par les rvalue references (enfin, en passant par std::forward pour faire simple) et les template variadiques, c'est totalement bluffant.
Le template<typename ...Args> void f(Args&& ...args) { g(std::forward<Args>(args)...); }
meme si c'est un truc que j'utilise sans arret en perl, je ne m'attendais vraiment pas a le retrouver en C++ 2011.