#include <type_traits>
#include <iostream>

template<class T>
struct trait{ using type = typename T::type; };

template<class T, class U = typename trait<T>::type>
void f(int);
void f(...);

template<class T, class U = typename T::type>
int g(int);
void g(...);

template<class>
struct dependent_false : std::true_type{};

template<class T>
struct X{
    static_assert(dependent_false<T>(), "...");
    using type = void;
};

int main(){
   //  f<int>(0);
    decltype(g<X<int>>(0)) y=5;
    std::cout<<"y: "<<y<<std::endl;
}