Before C++20, constraining a template with SFINAE required verbose std::enable_if_t boilerplate that resulted in 200-line compiler error cascades when constraints failed.
In C++20, concepts allow clean declarative constraints:
template<typename T>
concept Numeric = std::is_arithmetic_v<T>;
template<Numeric T>
T Add(T a, T b) {
return a + b;
}If someone passes std::string, Clang outputs: 'std::string' does not satisfy concept 'Numeric'. One clean, human-readable error line instead of a wall of template substitution failures!