#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();
}
这是一个无法编译的简单代码。如果改变了这个:
int main() {
nope();
}
到
int main() {
nope<std::string>();
}
它开始编译。 问题是为什么它的工作方式有效?更具体地说,为什么编译器会告诉我:
没有用于调用&#39; nope()&#39;
的匹配功能
而不是
找不到enable_if :: type (如果不满足条件,它确实不存在,这是真的吗?)
谢谢。
答案 0 :(得分:0)
如果您致电nope()
,则template
类型默认为int
。 std::enable_if_t<!std::is_arithmetic<T>{}, T>
为false
返回!std::is_arithmetic<int>{}
并失败。
对nope<int>()
的调用也会失败,原因与nope()
失败的原因相同。
另一方面,nope<std::string>
在true
中获得is_arithmetic
并返回工作函数。
使用clang++
版本5.0触发的编译器错误非常清楚地解释了结果:
候选模板已被忽略:要求&#39;
!std::is_arithmetic<int>{}
&#39;不满意[with T = int] std::enable_if_t<!std::is_arithmetic<T>{}, T> nope() {}