#include <iostream>
#include <functional>
#include <memory>
using namespace std;
template<typename T = int> std::enable_if_t<!std::is_arithmetic<T>{}, T> nope() {}
int main() {
nope();
}
这是一个简单的代码,不会编译。如果一个人改变了这一点:enable_if如何在这种情况下工作
int main() {
nope();
}
到
int main() {
nope<std::string>();
}
它开始编译。 问题是为什么这个工作像它的工作?更具体地讲,为什么编译器告诉我:
呼叫到 '没了()'
,而不是像
enable_if没有匹配功能::类型未找到 (这是真的,因为如果条件不满足,它确实不存在)?
谢谢。
既然你问为什么编译偏好另一个错误信息,你应该用你正在使用的编译器标记这个问题。 –
你看到的是[SFINAE](http://en.cppreference.com/w/cpp/language/sfinae)。 – HolyBlackCat
GCC和Clang都给出了体面的错误消息。 Clang甚至给出了注释:候选模板被忽略:被'enable_if'[with T = int]禁用,使用enable_if_t = typename enable_if <_Cond, _Tp> :: type;' – NathanOliver