Concepts
C++20 introduced a major enhancement to the C++ template machinery: concepts.
In C++20, templates (both class and function templates), as well as non-template functions (members of class templates, usually) may use a constraint to specify the requirements on template arguments. These constraints are useful to produce better error messages, but they are truly indispensable when there is a need to select a function overload or a template specialization based on some properties of template arguments.
The basic syntax for a constraint is quite simple: a constraint is introduced by the keyword requires
which can be specified after the function declaration or before the return type (in this book, we use both ways interchangeably so the reader becomes familiar with different styles of writing code). The expression itself usually uses the template parameters and must evaluate to a boolean value, for example:
// Example 13a template <typename T> T copy(T&& t...