2016-06-10 14 views
7

Potrebbe essere compilato il codice?Punto di istanziazione di una classe modello

#include <iostream> 

template <typename T> 
struct TMPL 
{ 
    using TP = typename T::TP; //is CL::TP visible (with T == CL)? 
}; 

struct CL 
{ 
    using TP = int; 
    TMPL<CL>::TP val; 
}; 

int main() 
{ 
    CL cl; 
} 

TMPL viene creata un'istanza immediatamente prima CL definizione di classe secondo la norma 14.6.4.1/4

Per una specializzazione modello di classe, ..., se la specializzazione è implicitamente un'istanza perché si fa riferimento dall'interno di un'altra specializzazione di modello , .... In caso contrario, il punto di istanziazione per tale specializzazione precede immediatamente la dichiarazione o la definizione dello spazio dei nomi che fa riferimento alla specializzazione.

Quindi, CL :: TP non è visibile nel punto TMPL esemplificazione, ma tutti i compilatori (MSVC, gcc, clang) compilare esso bene. Ho anche trovato un rapporto sui difetti http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#287, ma, apparentemente, non è stato accettato

+2

Inoltre, non è stato "rifiutato". È "redazione". Se fosse "rifiutato", lo stato sarebbe NAD. –

+0

L'ho letto, ma quella proposta non è ancora stata accettata, e il codice nel mio esempio non dovrebbe essere compilato, come penso – user3514538

+0

Come ho detto, 'CL' non è un modello. Il difetto non si applica ad esso. L'intento del difetto è di rendere il caso in cui 'CL' * è * un modello uguale al tuo esempio di codice. –

risposta

2

L'esempio non è identico a quello nello defect report. Nel rapporto sui difetti, CL è un modello di classe. Tuttavia l'intento della proposta di delibera è quello di rendere il caso modello lo stesso del non-modello di uno, aka [basic.scope.pdecl]:

6 Dopo il punto di dichiarazione di un membro della classe, il nome del membro può essere consultato nell'ambito della sua classe. [Nota: questo è vero anche se la classe è una classe incompleta. Ad esempio,

struct X { 
    enum E { z = 16 }; 
    int b[X::z];  // OK 
}; 

- fine nota]

Poi la proposta di delibera:

In 14.6.4.1 [temp.point] paragrafo 3 cambiamento:

il punto di istanziazione è immediatamente prima del punto di istanziazione del modello allegato. In caso contrario, il punto di istanziazione per tale specializzazione precede immediatamente la dichiarazione o la definizione dell'ambito dello spazio dei nomi che fa riferimento alla specializzazione .

A:

punto di istanziazione è lo stesso come il punto di esemplificazione del modello racchiude. In caso contrario, il punto di istanziazione per tale specializzazione precede immediatamente la dichiarazione di chiusura più vicina allo . [Nota: il punto di istanziazione è ancora in ambito spazio dei nomi, ma tutte le dichiarazioni che precedono il punto di istanziazione , anche se non in ambito spazio dei nomi, sono considerate aver visto .]

Add seguente paragrafo 3:

Se un modello di classe di specializzazione implicitamente istanziata, classe membro di specializzazione, o di specializzazione di un modello di classe riferimento ad una classe, modello di classe di specializzazione, membro della classe specializzazione, o di specializzazione di un modello di classe contenente un riferimento di specializzazione che ha causato direttamente o indirettamente l'istanziazione , i requisiti di completezza e ordinamento del riferimento di classe vengono applicati nel contesto del riferimento di specializzazione .

A partire dall'ultimo draft, il caso non modello era ed è ancora valido. Il caso del modello non lo è. Tuttavia, il difetto è drafting, il che significa che il case del modello è stato progettato per la compilazione.

Disegno: consenso informale è stato raggiunto nel gruppo di lavoro ed è descritta in termini grezzi in una risoluzione Provvisorio, anche se formulazione precisa per il cambiamento non è ancora disponibile.

+0

Grazie per la risposta. Intendevo solo un caso non modello, in cui il punto di istanziazione è posto prima della classe CL e non può vedere i membri di CL, che vengono posizionati in un secondo momento – user3514538

Problemi correlati