The fundamental difficulty that would arise is that concepts could become dependent:
template<class T>
struct A {
template<T::Q X>
void f();
};
Is X
a non-type template parameter of (dependent) type T::Q
(which does not require typename
in C++20), or is it a type template parameter constrained by the concept T::Q
?
The rule is that it’s the former; we would need new syntax (along the lines of typename
/template
) to express the other possibility: perhaps something like
template<T::concept Q X> requires T::concept R<X*>
void A::g() {}
No one has explored such an extension seriously, and it could easily conflict with other extensions to concept syntax that might be more valuable.