C++ 了解SFINAE

C++ 了解SFINAE,c++,templates,c++11,sfinae,template-argument-deduction,C++,Templates,C++11,Sfinae,Template Argument Deduction,据我所知,SFINAE意味着替换失败不会导致编译错误,而只是从可能的重载列表中删除原型 我不明白的是:为什么这是SFINAE: template <bool C, typename T = void> struct enable_if{}; template <typename T> struct enable_if<true, T> { typedef T type; }; template struct enable_if{}; 如果{typedef T

据我所知,SFINAE意味着替换失败不会导致编译错误,而只是从可能的重载列表中删除原型

我不明白的是:为什么这是SFINAE:

template <bool C, typename T = void> struct enable_if{};
template <typename T> struct enable_if<true, T> { typedef T type; };
template struct enable_if{};
如果{typedef T type;},则模板结构启用_;
但这不是吗

template <bool C> struct assert;
template <> struct assert<true>{};
模板结构断言;
模板结构断言{};

根据我的理解,这里的基本逻辑是相同的。这个问题出现在对的注释中。

在C++98中,SFINAE使用返回类型或带有默认参数的函数伪参数来完成

// SFINAE on return type for functions with fixed arguments (e.g. operator overloading)
template<class T>
typename std::enable_if< std::is_integral<T>::value, void>::type
my_function(T const&);

// SFINAE on dummy argument with default parameter for functions with no return type (e.g. constructors)
template<class T>
void my_function(T const&, std::enable_if< std::is_integral<T>::value, void>::type* = nullptr);

这两个代码都不是SFINAE。您似乎回答了自己的问题:SFINAE不会导致编译时错误(如果替换失败),而静态断言的全部目的是导致编译时错误(如果某些条件不正确)@jrok Wikipedia说
enable\u if
是SFINAE,错误吗?
enable\u如果
template是在其他上下文中触发SFINAE的既定方式。但就其本身而言,它只是一个类模板。(有趣的是,看到术语辩论评论如何得到回复和投票,而我的评论显然被完全忽略了…:'))您也可以在模板参数列表中执行此操作。因此
enable_if
不是SFINAE,而是
typename enable_if::type
是SFINAE,因为如果模板替换失败(只要它不是唯一匹配项),它不会导致错误?@nijansen很高兴能提供帮助。我还使用指向ACCU演示文稿的链接更新了答案。@dyp:否,默认模板参数在C++98中。否则,您不能使用
std::set
作为
std::set
的缩写。是的,我明白了。但是在C++98中,仍然可以使用带有默认模板参数的SFINAE。
// use C++11 default function arguments, no clutter in function's signature!
template<class T, class dummy = typename std::enable_if< std::is_integral<T>::value, void>::type>
void my_function(T const&);