[temp.constr.normal] (original) (raw)
The normal form of a concept-id C<A, A, ..., A>is the normal form of the constraint-expression of C, after substituting A, A, ..., A forC's respective template parameters in the parameter mappings in each atomic constraint.
If any such substitution results in an invalid type or expression, the program is ill-formed; no diagnostic is required.
[Example 1: template<typename T> concept A = T::value || true;template<typename U> concept B = A<U*>;template<typename V> concept C = B<V&>;
Normalization of B's constraint-expressionis valid and results inT::value (with the mapping )∨ true (with an empty mapping), despite the expression T::value being ill-formed for a pointer type T.
Normalization of C's constraint-expressionresults in the program being ill-formed, because it would form the invalid type V&*in the parameter mapping.
— _end example_]