在任何兼容的编译器中编译都必须失败。
SFINAE 规则基于声明而非定义。(对不起,如果我在这里使用了错误的术语。)我的意思是:
对于类/结构:
template < /* substitution failures here are not errors */ >
struct my_struct {
// Substitution failures here are errors.
};
对于一个函数:
template </* substitution failures here are not errors */>
/* substitution failures here are not errors */
my_function( /* substitution failures here are not errors */) {
/* substitution failures here are errors */
}
此外,给定模板参数集的结构/函数不存在也受 SFINAE 规则的约束。
现在 astatic_assert
只能出现在替换失败是错误的区域中,因此,如果它触发,您将收到编译器错误。
例如,以下将是错误的实现enable_if
:
// Primary template (OK)
template <bool, typename T>
struct enable_if;
// Specialization for true (also OK)
template <typename T>
struct enable_if<true, T> {
using type = T;
};
// Specialization for false (Wrong!)
template <typename T>
struct enable_if<false, T> {
static_assert(std::is_same<T, T*>::value, "No SFINAE here");
// The condition is always false.
// Notice also that the condition depends on T but it doesn't make any difference.
};
然后试试这个
template <typename T>
typename enable_if<std::is_integral<T>::value, int>::type
test(const T &t);
void test(...);
int main()
{
std::cout << std::is_same<decltype(test(0)), int>::value << std::endl; // OK
std::cout << std::is_same<decltype(test(0.0)), void>::value << std::endl; // Error: No SFINAE Here
}
如果您删除 for 的特化enable_if
,false
则代码将编译并输出
1
1