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).
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).
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).
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 ex empt
de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre
l'entier 0 et le const char * NULL :-( ).
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 ex empt
de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre
l'entier 0 et le const char * NULL :-( ).
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 ex empt
de bug, j'ai trouvé un truc rigolo avec le dernier g++ entre
l'entier 0 et le const char * NULL :-( ).
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.
JKB <jkb@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.
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.
Le Thu, 26 Apr 2012 09:54:54 +0200,
Jean-Marc Bourguet écrivait :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.
Sauf que même en forçant explicitement le type, le compilo n'e n a
rien à faire. Avoir une méthode foo(const char *p) et une seco nde
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).
Le Thu, 26 Apr 2012 09:54:54 +0200,
Jean-Marc Bourguet <jm@bourguet.org> écrivait :
JKB <jkb@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.
Sauf que même en forçant explicitement le type, le compilo n'e n a
rien à faire. Avoir une méthode foo(const char *p) et une seco nde
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).
Le Thu, 26 Apr 2012 09:54:54 +0200,
Jean-Marc Bourguet écrivait :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.
Sauf que même en forçant explicitement le type, le compilo n'e n a
rien à faire. Avoir une méthode foo(const char *p) et une seco nde
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).
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.
(le truc pas bien, c'est que tu peux VRAIMENT faire ce que tu veux, meme
et surtout si c'est n'importe quoi).
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.
(le truc pas bien, c'est que tu peux VRAIMENT faire ce que tu veux, meme
et surtout si c'est n'importe quoi).
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.
(le truc pas bien, c'est que tu peux VRAIMENT faire ce que tu veux, meme
et surtout si c'est n'importe quoi).
JKB writes:Le Thu, 26 Apr 2012 09:54:54 +0200,
Jean-Marc Bourguet écrivait :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.
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).
Encore plus. Quelle version? Bon
#include <iostream>
struct C {
void f(int) {
std::cout << "f(int)n";
}
void f(char const*) {
std::cout << "f(char const*)n";
}
};
int main()
{
C c;
c.f(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.
JKB <jkb@koenigsberg.invalid> writes:
Le Thu, 26 Apr 2012 09:54:54 +0200,
Jean-Marc Bourguet <jm@bourguet.org> écrivait :
JKB <jkb@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.
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).
Encore plus. Quelle version? Bon
#include <iostream>
struct C {
void f(int) {
std::cout << "f(int)n";
}
void f(char const*) {
std::cout << "f(char const*)n";
}
};
int main()
{
C c;
c.f(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.
JKB writes:Le Thu, 26 Apr 2012 09:54:54 +0200,
Jean-Marc Bourguet écrivait :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.
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).
Encore plus. Quelle version? Bon
#include <iostream>
struct C {
void f(int) {
std::cout << "f(int)n";
}
void f(char const*) {
std::cout << "f(char const*)n";
}
};
int main()
{
C c;
c.f(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.
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++).
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++).
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++).
(En C NULL peut aussi etre definit comme (void*)0, c'est pas autorise en
C++).
mais necessaire pour les appels de fonctions variadic...
(En C NULL peut aussi etre definit comme (void*)0, c'est pas autorise en
C++).
mais necessaire pour les appels de fonctions variadic...
(En C NULL peut aussi etre definit comme (void*)0, c'est pas autorise en
C++).
mais necessaire pour les appels de fonctions variadic...
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.
#include <iostream>
struct C {
void f(int) {
std::cout << "f(int)n";
}
void f(char const*) {
std::cout << "f(char const*)n";
}
};
int main()
{
C c;
c.f(0);
}
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.
#include <iostream>
struct C {
void f(int) {
std::cout << "f(int)n";
}
void f(char const*) {
std::cout << "f(char const*)n";
}
};
int main()
{
C c;
c.f(0);
}
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.
#include <iostream>
struct C {
void f(int) {
std::cout << "f(int)n";
}
void f(char const*) {
std::cout << "f(char const*)n";
}
};
int main()
{
C c;
c.f(0);
}
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.
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.
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.