https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89898
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- This is valid C++ 20 too: struct A { int t; }; template <A a> struct X { int d = a.t; }; template<X<A{}> a > int f () { return a.d; } int g(void) { return f<X<A{0}>{1}>(); } Yes I know it looks off but it is valid now and f<<X<A{0}>{1}> will return 1. Note {} and {0} are the same here really. Even something like this is valid now too: struct A { int t; }; template <A a> struct X { int d = a.t; }; template<A a, X<a> x > int f () { return x.d; } int g(void) { return f<A{2}, X<A{2}>{1}>(); }