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.
- Ho erroneamente interpretato il paragrafo citato?
- Esiste un paragrafo che specifica il comportamento "corretto"?
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 \]). –
@ 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
Che cos'è esattamente una "classe base dipendente"? Al contrario di dire una classe base indipendente? C'è una cosa del genere? – EJP