Substitution failure is not an error refers to a situation in C++ where an invalid substitution of template parameters is not in itself an error. David Vandevoorde first introduced the acronym SFINAE to describe related programming techniques. Specifically, when creating a candidate set for overload resolution, some candidates of that set may be the result of instantiated templates with template arguments substituted for the corresponding template parameters. If an error occurs during the substitution of a set of arguments for any given template, the compiler removes the potential overload from the candidate set instead of stopping with a compilation error, provided the substitution error is one the C++ standard grants such treatment. If one or more candidates remain and overload resolution succeeds, the invocation is well-formed.
Example
The following example illustrates a basic instance of SFINAE: struct Test ; template void f // Definition #1 template void f // Definition #2 int main
Here, attempting to use a non-class type in a qualified name results in a deduction failure for f because int has no nested type named foo, but the program is well-formed because a valid function remains in the set of candidate functions. Although SFINAE was initially introduced to avoid creating ill-formed programs when unrelated template declarations were visible, many developers later found the behavior useful for compile-time introspection. Specifically, it allows a template to determine certain properties of its template arguments at instantiation time. For example, SFINAE can be used to determine if a typecontains a certain typedef:
include
template struct has_typedef_foobar ; struct foo ; int main
When T has the nested type foobar defined, the instantiation of the first test works and the null pointer constant is successfully passed. If it does not work, the only available function is the second test, and the resulting type of the expression is no. An ellipsis is used not only because it will accept any argument, but also because its conversion rank is lowest, so a call to the first function will be preferred if it is possible; this removes ambiguity.