Может ли этот код быть скомпилирован?Точка создания шаблона класса
#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 сразу инстанцирован до определения класса CL согласно стандарту 14.6.4.1/4
Для шаблона класса специализации, ..., если специализация неявно экземпляр, поскольку он ссылается изнутри другой шаблон специализации, .... В противном случае точка инстанцирования для такой специализации сразу предшествует области пространства имен декларация или определение, которое относится к специализации.
Так, CL :: TP не отображается в точке TMPL экземпляра, но все компиляторы (MSVC, GCC, лязг) скомпилировать его в порядке. Я также нашел отчет о дефекте http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#287, но он, по-видимому, не был принят
Кроме того, это не было «отклонено». Это «разработка». Если бы это было «отклонено», статус был бы НАД. –
Я прочитал его, но это предложение еще не принято, и код в моем примере не должен компилироваться, так как я думаю – user3514538
Как я уже сказал, 'CL' не является шаблоном. Дефект не относится к нему. Целью дефекта является создание случая, когда 'CL' * является * шаблоном так же, как ваш пример кода. –