substitution failure is not an error
/* "Substitution Failure Is Not An Error"
This rule applies during overload resolution of function templates:
When substituting the explicitly specified or deduced type for the
template parameter fails, the specialization is discarded from the
overload set instead of causing a compile error.
This feature is used in template metaprogramming.
STL features like std::enable_if use SFINAE
*/