template concept Derived = std::is_base_of::value; // ^ keyword // ^ type template concept Hashable = requires(T a) { // ^ keyword // ^ parameter // ^ type { std::hash{}(a) } -> std::convertible_to; typename CommonType; // CommonType is valid and names a type { CommonType{std::forward(t)} }; { CommonType{std::forward(u)} }; }; template requires requires (T x) { x + x; } // ad-hoc constraint, note keyword used twice // ^ keyword T add(T a, T b) { return a + b; }