Je pensais que address-of-static était une expression constante comme dans l'exemple ci-dessous mais j'obtiens une erreur du compilateur (ou est-ce nouveau dans C++0x ?)
class X {
static const int x;
enum { y = &x };
};
Je pensais que address-of-static était une expression constante comme dans l'exemple ci-dessous mais j'obtiens une erreur du compilateur (ou est-ce nouveau dans C++0x ?)
class X {
static const int x;
enum { y = &x };
};
L'adresse d'une variable (qu'elle soit statique ou non statique) n'est pas un critère de sélection. temps de compilation constant. enum
nécessite temps de compilation constante. C'est pourquoi il y a une erreur.
En fait, GCC donne un message d'erreur très clair :
prog.cpp:7 : erreur : 'X::x' ne peut pas apparaître dans une expression constante.
prog.cpp:7 : error : `&' ne peut pas apparaître dans une expression constante
Voyez vous-même : http://ideone.com/FJk3C
Toutefois, les éléments suivants sont autorisé :
class X {
static const int x;
enum { y = sizeof(x) }; //okay. sizeof(x) can be known at compile time!
};
Ne confondez pas les constantes de compilation avec les constantes d'exécution. Ce sont deux choses différentes.
En lisant la norme de 1998, 5.19(1) : "À plusieurs endroits, le C++ exige des expressions qui évaluent à une constante intégrale ou d'énumération... comme initialisateurs d'énumérateurs (7.2)....".
De plus, "Une expression constante intégrale ne peut impliquer que....En particulier, sauf dans les cas suivants sizeof
les expressions, fonctions, objets de classe, pointeurs ou références ne doivent pas être utilisés...."
Les littéraux flottants sont explicitement listés comme pouvant être castés vers un type intégral ou d'énumération, et rien d'autre ne l'est.
Le fait de couler même une expression constante d'adresse pour en faire un initialisateur d'énumérateur était invalide dès la première norme.
C'est une expression constante, mais elle ne peut pas être déterminée au moment de la compilation. La valeur réelle de l'adresse dépendra de la région de la mémoire dans laquelle l'exécutable sera chargé par le chargeur de l'OS qui exécute le programme. Les membres des Enum doivent avoir des valeurs qui peuvent être déterminées par le compilateur.
A la vôtre,
J.
L'adresse d'un objet statique est une expression constante, mais mais ce n'est pas une expression constante intégrale, parce qu'elle n'a pas n'a pas de type intégral. Et reinterpret_cast
à une n'en fait pas pour autant une expression intégrale constante intégrale, puisque reinterpret_cast
n'est pas autorisé dans les intégrales constantes intégrales. Et l'initialisateur d'un enum
valeur nécessite une expression constante intégrale.
En l'état actuel des choses, bien sûr, la raison pour laquelle vous obtenez un compilateur est que vous essayez d'initialiser un fichier enum
valeur avec une expression qui n'est pas de type intégral, et qui n'a pas n'a pas de conversion implicite vers un type intégral.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.