template<class T> struct component {};
template<class T> using alias = component<T>;
template<class T, class C> struct thing {};
template<class T, template<class> class C> struct thing2 {};
static_assert(std::is_same_v<thing<int, component<int>>, thing<int, alias<int>>>);
// succeeds
static_assert(std::is_same_v<thing2<int, component>, thing2<int, alias>>);
// fails on both gcc and clang
I can't think of any good reason why the second assert should fail, but perhaps I've missed something!