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
Inoltre, non è stato "rifiutato". È "redazione". Se fosse "rifiutato", lo stato sarebbe NAD. –
L'ho letto, ma quella proposta non è ancora stata accettata, e il codice nel mio esempio non dovrebbe essere compilato, come penso – user3514538
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. –