[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_]