2015-09-19 11 views
15

Come sappiamo, il codice riportato di seguito è mal formato poiché il membro x si trova in una classe di base dipendente. Tuttavia, la modifica di x a this->x sulla riga indicata corregge l'errore.Qual è la regola che consente a `this->` di accedere ai membri delle classi di base dipendenti?

template <typename T> 
struct B { 
    int x; 
}; 
template <typename T> 
struct C : B<T> { 
    void f() { 
     int y = x; // Error! 
    } 
}; 
int main() { 
    C<int> c; 
    c.f(); 
} 

Vorrei una spiegazione di come questo comportamento è specificato nella norma. Secondo [temp.dep]/3:

Nella definizione di un modello di classe o una classe, se una classe di base dipende da un modello-parametro , la portata classe base non viene esaminato durante nome non qualificato ricerca al punto di definizione del modello di classe o membro o durante un'istanza del modello di classe o membro.

Questo sembra spiegare perché l'utilizzo di x da solo non riesce. Il nome x viene ricercato nel punto di definizione e l'ambito della classe base non viene esaminato. Tuttavia, cosa succede se usiamo this->x? Ora il nome x dipende e la sua ricerca viene posticipata fino alla creazione di istanze. Ma il comma citato sembra implicare che x Non si deve trovare anche in fase di istanziazione, dal momento che la ricerca di x in this->x è ancoraqualificato ricerca.

Ovviamente le implementazioni non si comportano in questo modo ed è ampiamente compreso che lo scope della classe base è cercato una volta che il modello viene istanziato.

  1. Ho erroneamente interpretato il paragrafo citato?
  2. Esiste un paragrafo che specifica il comportamento "corretto"?
+3

Questa non è una ricerca non qualificata (3.4.1 \ [basic.lookup.unqual \]), questa è la ricerca di espressioni di accesso ai membri della classe (3.4.5 \ [basic.lookup.classref \]). –

+0

@ n.m. Grazie, non mi ero reso conto che la ricerca del nome del membro della classe era un tipo distinto di ricerca del nome. Dovresti fare una risposta. – Brian

+0

Che cos'è esattamente una "classe base dipendente"? Al contrario di dire una classe base indipendente? C'è una cosa del genere? – EJP

risposta

7

Le espressioni di accesso dei membri della classe (5.2.5. [Expr.ref]) non utilizzano regole di ricerca non qualificate, ma usano regole di ricerca di accesso dei membri della classe (3.4.5 [basic.lookup.classref]).

(2) Se il id-espressione in un accesso membro della classe (5.2.5) è un qualificato-id, e il tipo dell'espressione oggetto è di un tipo di classe C, il unqualified- id è cercato nell'ambito della classe C.

Problemi correlati