我已经使用了SFINAE习惯用了很多次,我习惯于把std::enable_if<>模板参数放在模板参数而不是返回类型中.但是,我遇到了一些不起作用的琐碎案例,我不知道为什么.首先,这是我的主要内容:
int main()
{
foo(5);
foo(3.4);
}
Run Code Online (Sandbox Code Playgroud)
这是一个foo触发错误的实现:
template<typename T,
typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T)
-> void
{
std::cout << "I'm an integer!\n";
}
template<typename T,
typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T)
-> void
{
std::cout << "I'm a floating point number!\n";
}
Run Code Online (Sandbox Code Playgroud)
这是一个可以正常工作的等效代码:
template<typename T>
auto foo(T)
-> typename std::enable_if<std::is_integral<T>::value>::type
{
std::cout << "I'm an integrer!\n";
}
template<typename T>
auto foo(T)
-> typename std::enable_if<std::is_floating_point<T>::value>::type
{
std::cout << "I'm a floating point number!\n";
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么第一次执行 …
据我所知,SFINAE意味着替换失败不会导致编译错误,只是从可能的重载列表中删除原型.
我不明白:为什么这个SFINAE:
template <bool C, typename T = void> struct enable_if{};
template <typename T> struct enable_if<true, T> { typedef T type; };
Run Code Online (Sandbox Code Playgroud)
但这不是吗?
template <bool C> struct assert;
template <> struct assert<true>{};
Run Code Online (Sandbox Code Playgroud)
根据我的理解,这里的基本逻辑是相同的.这个问题来自对这个答案的评论.