Laurent Deniau writes:drkm wrote:Laurent Deniau writes:me semble qu'a *l'exterieur de la definition d'une classe* on peut
utiliser partout un const int a la place d'un enum. La reciproque
n'est biensur pas vraie.Si tu parles de la réciproque « enum à la place d'un int », alors
si. Une énumération est implicitement convertible en entier, non ?enum { e=1 };
const int a=1;const int *p = &a; // ok
const int *q = &e; // boumDonc la ou a passe, e ne passe pas necessairement...
Mais c'est encore moins vrai dans l'autre sens, non ? Puisqu'il n'y
a pas de conversion implicite des entiers vers les énumération :
~> cat fclcxx.cc
enum E {
e = 0
} ;
int monI = e ;
E monE = 0 ;
~> g++ -o fclcxx.o -c fclcxx.cc -Wall -ansi -pedantic
fclcxx.cc:5: error: invalid conversion from 'int' to 'E'
Pour ce qui est de l'utilisation d'un entier à la place d'une
énumération, cela me semble bizarre. Ne t'emmêles-tu pas simplement
les pinceaux avec leur utilisation commune en tant que « integral
constant-expression » ?J'ai parler de comportement. Je n'ai pas dit qu'un const int etait un
enum. Je demandais pour infirmer ma conjecture un exemple qui montre
un cas d'utilisation en C++ ou un enum ne peut pas etre substitue par
un const int.
Cfr. l'exemple ci-dessus, en remplaçant le litéral '0' par une
variable de type « int const », ce qui revient à la même erreur.
En C on a le cas trivial:{ // Ok C++ pas C
const int size = 10;
int array[size];// ...
}
Tu veux dire que ceci n'est pas du C ? J'aurais dit qu'à l'inverse
du C++, en C, size peut même n'être pas constant. Cfr. les VLAs.
Non ?
La particularite C++ est que const int peut etre utilise dans une
expression integrale constante, a condition que son initialisation
soit elle meme une expression integrale constante, ce n'est pas le cas
en C.
Il s'agit alors lui-même d'une « integral constant-expression ».
Cfr. 5.19 :
« An integral constant-expression can involve only literals,
enumerators, const variables or static data members of integral
or enumeration types initialized with constant expressions,
non-type template parameters of integral or enumeration types,
and sizeof expressions. »
Mais peut-être n'ai pas tout à fait compris ce que tu voulais dire ?
Laurent Deniau <Laurent.Deniau@cern.ch> writes:
drkm wrote:
Laurent Deniau <Laurent.Deniau@cern.ch> writes:
me semble qu'a *l'exterieur de la definition d'une classe* on peut
utiliser partout un const int a la place d'un enum. La reciproque
n'est biensur pas vraie.
Si tu parles de la réciproque « enum à la place d'un int », alors
si. Une énumération est implicitement convertible en entier, non ?
enum { e=1 };
const int a=1;
const int *p = &a; // ok
const int *q = &e; // boum
Donc la ou a passe, e ne passe pas necessairement...
Mais c'est encore moins vrai dans l'autre sens, non ? Puisqu'il n'y
a pas de conversion implicite des entiers vers les énumération :
~> cat fclcxx.cc
enum E {
e = 0
} ;
int monI = e ;
E monE = 0 ;
~> g++ -o fclcxx.o -c fclcxx.cc -Wall -ansi -pedantic
fclcxx.cc:5: error: invalid conversion from 'int' to 'E'
Pour ce qui est de l'utilisation d'un entier à la place d'une
énumération, cela me semble bizarre. Ne t'emmêles-tu pas simplement
les pinceaux avec leur utilisation commune en tant que « integral
constant-expression » ?
J'ai parler de comportement. Je n'ai pas dit qu'un const int etait un
enum. Je demandais pour infirmer ma conjecture un exemple qui montre
un cas d'utilisation en C++ ou un enum ne peut pas etre substitue par
un const int.
Cfr. l'exemple ci-dessus, en remplaçant le litéral '0' par une
variable de type « int const », ce qui revient à la même erreur.
En C on a le cas trivial:
{ // Ok C++ pas C
const int size = 10;
int array[size];
// ...
}
Tu veux dire que ceci n'est pas du C ? J'aurais dit qu'à l'inverse
du C++, en C, size peut même n'être pas constant. Cfr. les VLAs.
Non ?
La particularite C++ est que const int peut etre utilise dans une
expression integrale constante, a condition que son initialisation
soit elle meme une expression integrale constante, ce n'est pas le cas
en C.
Il s'agit alors lui-même d'une « integral constant-expression ».
Cfr. 5.19 :
« An integral constant-expression can involve only literals,
enumerators, const variables or static data members of integral
or enumeration types initialized with constant expressions,
non-type template parameters of integral or enumeration types,
and sizeof expressions. »
Mais peut-être n'ai pas tout à fait compris ce que tu voulais dire ?
Laurent Deniau writes:drkm wrote:Laurent Deniau writes:me semble qu'a *l'exterieur de la definition d'une classe* on peut
utiliser partout un const int a la place d'un enum. La reciproque
n'est biensur pas vraie.Si tu parles de la réciproque « enum à la place d'un int », alors
si. Une énumération est implicitement convertible en entier, non ?enum { e=1 };
const int a=1;const int *p = &a; // ok
const int *q = &e; // boumDonc la ou a passe, e ne passe pas necessairement...
Mais c'est encore moins vrai dans l'autre sens, non ? Puisqu'il n'y
a pas de conversion implicite des entiers vers les énumération :
~> cat fclcxx.cc
enum E {
e = 0
} ;
int monI = e ;
E monE = 0 ;
~> g++ -o fclcxx.o -c fclcxx.cc -Wall -ansi -pedantic
fclcxx.cc:5: error: invalid conversion from 'int' to 'E'
Pour ce qui est de l'utilisation d'un entier à la place d'une
énumération, cela me semble bizarre. Ne t'emmêles-tu pas simplement
les pinceaux avec leur utilisation commune en tant que « integral
constant-expression » ?J'ai parler de comportement. Je n'ai pas dit qu'un const int etait un
enum. Je demandais pour infirmer ma conjecture un exemple qui montre
un cas d'utilisation en C++ ou un enum ne peut pas etre substitue par
un const int.
Cfr. l'exemple ci-dessus, en remplaçant le litéral '0' par une
variable de type « int const », ce qui revient à la même erreur.
En C on a le cas trivial:{ // Ok C++ pas C
const int size = 10;
int array[size];// ...
}
Tu veux dire que ceci n'est pas du C ? J'aurais dit qu'à l'inverse
du C++, en C, size peut même n'être pas constant. Cfr. les VLAs.
Non ?
La particularite C++ est que const int peut etre utilise dans une
expression integrale constante, a condition que son initialisation
soit elle meme une expression integrale constante, ce n'est pas le cas
en C.
Il s'agit alors lui-même d'une « integral constant-expression ».
Cfr. 5.19 :
« An integral constant-expression can involve only literals,
enumerators, const variables or static data members of integral
or enumeration types initialized with constant expressions,
non-type template parameters of integral or enumeration types,
and sizeof expressions. »
Mais peut-être n'ai pas tout à fait compris ce que tu voulais dire ?
C'est pourtant un très gros reproche fait au C++ : sa SL
C'est pourtant un très gros reproche fait au C++ : sa SL
C'est pourtant un très gros reproche fait au C++ : sa SL