2011-10-26 3 views
7

Dans l'exemple suivant, la taille du tableau v est-elle garantie à 2 ou 3?Étendue des membres de la classe

static const int i = 3; 

class X { 

    char v[i]; 
    static const int i = 2; 
}; 

de la norme,

3.3.6/2 Un nom N utilisé dans une classe S renvoie à la même déclaration dans son contexte et lors d'une nouvelle évaluation dans le cadre de S complété

Je pense que cela signifie que 'i' doit être 2 et que signifie vraiment la chose de réévaluation ici?

Répondre

4

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

1

La taille de la matrice devrait être de 3 po est le cas. Si vous regardez dans votre code ligne par ligne. Compliler ne sait rien à propos de X :: i lors de la construction du tableau. Si vous changez des lignes à l'intérieur de la classe lorsque la taille du tableau devient 2 et la seconde, je vais d'abord cacher.

Questions connexes