12 Templates [temp]

12.6 Template declarations [temp.decls]

12.6.8 Concept definitions [temp.concept]

A concept is a template that defines constraints on its template arguments.
A concept-definition declares a concept.
Its identifier becomes a concept-name referring to that concept within its scope.
[Example
:
template<typename T>
concept C = requires(T x) {
  { x == x } -> bool;
};

template<typename T>
  requires C<T>     // C constrains f1(T) in constraint-expression
T f1(T x) { return x; }

template<C T>       // C constrains f2(T) as a constrained-parameter
T f2(T x) { return x; }
end example
]
A concept-definition shall appear at namespace scope ([basic.scope.namespace]).
A concept shall not have associated constraints.
A concept is not instantiated ([temp.spec]).
[Note
:
An id-expression that denotes a concept specialization is evaluated as an expression ([expr.prim.id]).
A concept cannot be explicitly instantiated ([temp.explicit]), explicitly specialized ([temp.expl.spec]), or partially specialized.
end note
]
The first declared template parameter of a concept definition is its prototype parameter.
A variadic concept is a concept whose prototype parameter is a template parameter pack.