Content deleted Content added
m Task 70: Update syntaxhighlight tags - remove use of deprecated <source> tags |
No edit summary |
||
(11 intermediate revisions by 9 users not shown) | |||
Line 1:
{{Short description|C++ programming technique}}
'''Substitution failure is not an error''' ('''SFINAE''') refers to a situation in [[C++]] where an invalid substitution of [[template (programming)|template]] parameters is not in itself an error. David Vandevoorde first introduced the acronym SFINAE to describe related programming techniques.<ref>{{cite book | last=Vandevoorde | first=David |author2=Nicolai M. Josuttis | title=C++ Templates: The Complete Guide | publisher=Addison-Wesley Professional | year=2002 | isbn=0-201-73484-2}}</ref>▼
▲'''Substitution failure is not an error''' ('''SFINAE''')
Specifically, when creating a candidate set for [[overload resolution]], some (or all) candidates of that set may be the result of instantiated templates with (potentially deduced) 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
==Example==
Line 21 ⟶ 23:
f<int>(10); // Call #2. Without error (even though there is no int::foo)
// thanks to SFINAE.
return 0;
}
</syntaxhighlight>
Line 34 ⟶ 37:
template <typename T>
struct
// Types "yes" and "no" are guaranteed to have different sizes,
// specifically sizeof(yes) == 1 and sizeof(no) == 2.
Line 52 ⟶ 55:
};
struct
typedef float foobar;
};
Line 58 ⟶ 61:
int main() {
std::cout << std::boolalpha;
std::cout <<
std::cout <<
return 0;
}
</syntaxhighlight>
Line 71 ⟶ 75:
#include <iostream>
#include <type_traits>
template <typename T, typename = void>
struct
template <typename T>
struct
struct
using foobar = float;
};
Line 87 ⟶ 88:
int main() {
std::cout << std::boolalpha;
std::cout <<
std::cout <<
return 0;
}
</syntaxhighlight>
Line 98 ⟶ 100:
template <typename T>
using
struct
using foobar = float;
};
Line 106 ⟶ 108:
int main() {
std::cout << std::boolalpha;
std::cout << std::is_detected<
std::cout << std::is_detected<
return 0;
}
</syntaxhighlight>
The developers of [[Boost C++ Libraries|Boost]] used SFINAE in boost::enable_if<ref name="enable_if">[http://www.boost.org/doc/libs/release/libs/utility/enable_if.html Boost Enable If]</ref> and in other ways.
Line 116 ⟶ 119:
{{reflist}}
{{C++ programming language}}
▲{{use dmy dates|date=January 2012}}
[[Category:C++]]
[[Category:Articles with example C++ code]]
|