3 votes

L'adresse de static const n'est pas une expression const ?

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 };
};

5voto

Nawaz Points 148870

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.

2voto

David Thornley Points 39051

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.

1voto

decltype Points 1271

Le programme est mal formé car :

  • l'adresse d'un objet n'est pas un expression constante intégrale
  • prendre l'adresse de x nécessite a(n hors de la classe) définition
  • l'utilisation d'un membre intégral statique const partout, sauf lorsqu'une intégrale est requise, il faut une définition.

1voto

João Mendes Points 1170

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.

1voto

James Kanze Points 96599

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.com

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.

Powered by:

X