我写了一个类似于Y组合子的函数:
template <class F>
struct Y{
F f;
Y(F _f) : f{_f} {}
template<class...arg_t>
auto operator()(arg_t&&...arg) {return f(*this,std::forward<arg_t>(arg)...);}
};
它可以工作,但是当我尝试定义一个阶乘时
auto fact = Y{[](auto&& self, int n) {
if (n<=1) return 1;
return n*self(n-1);}};
代码可以编译通过,但当我像f(3)
这样调用它时,clang在推导返回类型时卡住了。加上显式的返回类型后,一切正常。这是模板推导的限制吗?有没有解决办法?