Substitution Failure Is Not An Error
From Wikipedia, the free encyclopedia (editted formatting)
In attempting to use function template argument deduction to select among a number of candidate function templates, a C++ compiler may attempt an instantiation that fails on one or more of them.
For example, consider the following C++ program:
void f( T );
void f( T * );
f( 1024 ); // instantiates first f
Even though substitution of the integer for T * in the second f function template would have been incorrect, the attempted substitution does not give rise to an error provided that a correct substitution is found. In this case, the first f is instantiated, and there is no error. Thus, we have the “substitution failure is not an error” concept, dubbed SFINAE by David Vandevoorde and Nicolai Josuttis. SFINAE is an important property in that, without it, it would be difficult to overload function templates; the combination of argument deduction and overloading would render many uses of a set of overloaded function templates illegal. But SFINAE is also valuable as a metaprogramming technique.