template<typename T>
struct a
{
using type = int;
typename T::type i;
};
template<typename T, typename = a<T>>
void f1(T) {}
template<typename T, typename = typename a<T>::type>
void f2(T) {}
int main()
{
f1<int>(1); // ok
f2<int>(1); // error
return 0;
}
Создание экземпляра a<int>
должно быть ошибкой, потому что int::type
является незаконным. Но кажется, что f1<int>
не может вызвать создание a<T>
, но f2<int>
can. Какая причина?