Content deleted Content added
m date audit and style fixes per MOS:NUM and minor clean-up |
No edit summary |
||
(2 intermediate revisions by one other user not shown) | |||
Line 3:
'''Substitution failure is not an error''' ('''SFINAE''') is a principle in [[C++]] where an invalid substitution of [[Template (C++)|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>
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 37:
template <typename T>
struct
// Types "yes" and "no" are guaranteed to have different sizes,
// specifically sizeof(yes) == 1 and sizeof(no) == 2.
Line 55:
};
struct
typedef float foobar;
};
Line 61:
int main() {
std::cout << std::boolalpha;
std::cout <<
std::cout <<
return 0;
}
Line 75:
#include <iostream>
#include <type_traits>
template <typename T, typename = void>
struct
template <typename T>
struct
struct
using foobar = float;
};
Line 91 ⟶ 88:
int main() {
std::cout << std::boolalpha;
std::cout <<
std::cout <<
return 0;
}
Line 103 ⟶ 100:
template <typename T>
using
struct
using foobar = float;
};
Line 111 ⟶ 108:
int main() {
std::cout << std::boolalpha;
std::cout << std::is_detected<
std::cout << std::is_detected<
return 0;
}
|