https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96331
TC <rs2740 at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |rs2740 at gmail dot com --- Comment #2 from TC <rs2740 at gmail dot com> --- (In reply to Jonathan Wakely from comment #1) > (In reply to Nicole from comment #0) > > template<fixed_string NAME, typename TYPE> > > This is not valid. fixed_string is a class template, not a type and not a > concept. So you can't use it as a template parameter. > > I don't think this is a bug. It is a placeholder for a deduced class type, which is allowed by [temp.param]/6.3. The example can be reduced drastically: template<int N = 0> struct S { }; template<S> concept C = true; static_assert(C<S<0>{}>); // OK template<S Value> void f() requires C<Value> { // error } <source>:11:19: error: class template argument deduction failed: 11 | void f() requires C<Value> { | ^~~~~~~~ <source>:11:19: error: no matching function for call to 'S(S<...auto...>)' <source>:2:8: note: candidate: 'template<int N> S()-> S<N>' 2 | struct S { | ^ <source>:2:8: note: template argument deduction/substitution failed: <source>:11:19: note: candidate expects 0 arguments, 1 provided 11 | void f() requires C<Value> { | ^~~~~~~~ <source>:2:8: note: candidate: 'template<int N> S(S<N>)-> S<N>' 2 | struct S { | ^ <source>:2:8: note: template argument deduction/substitution failed: <source>:11:19: note: mismatched types 'S<N>' and 'S<...auto...>' 11 | void f() requires C<Value> { | ^~~~~~~~ Compiler returned: 1