SFINAE Substitution Failure Is Not An Error
The C++ rule that a template which becomes invalid once the types are substituted is quietly dropped from the candidate set instead of stopping the compilation.
The rule existed originally so that overload resolution would behave sensibly, but was soon discovered to work as an interrogation tool: write a template that can only be instantiated if a type has some property, and let the compiler pick the one overload that survives. Out of that grew std::enable_if, the whole type-traits library, and a generation of code that decided at compile time whether a type had a begin() method. It worked, but the idiom was oblique and a single mistake produced screens of errors about why no candidate matched. C++20 effectively replaced the whole technique with concepts and requires, which state the same thing outright.