Le comportement correct est qu'il doit provoquer une erreur, car la réévaluation changerait le sens:
Exemple de la section 3.3.6:
La portée potentielle d'une déclaration qui s'étend ou passé la fin d'une définition de classe s'étend également aux régions définies par ses définitions membres, même si les membres sont définis lexicalement en dehors de la classe (ceci inclut les définitions de membres de données statiques, les définitions de classes imbriquées, , pour les fonctions constructeurs (12.1), l'initialisateur ctor (12.6.2)) et toute partie de la déclaration partie rator de ces définitions qui suivent l'identificateur, y compris une clause parameter-declaration-clause et tout argument par défaut (8.3.6). [Exemple:
L'exemple est similaire à la vôtre (en utilisant enum
au lieu d'un static const int
):
typedef int c;
enum { i = 1 };
class X {
char v[i]; // error: i refers to ::i
// but when reevaluated is X::i
int f() { return sizeof(c); } // OK X::c
char c;
enum { i = 2 };
};
Au moment v[i]
est rencontré, le compilateur ne connaît que enum { i = 1 };
(ou static const int i = 3;
, mais quand la déclaration de classe complète est connue, char v[i]
serait différent car i
serait réévalué à 2