【发布时间】:2019-05-22 11:40:36
【问题描述】:
我写了一个这样的 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 被困在推断返回类型上。使用显式返回类型,一切正常。这是模板扣除的限制吗?有解决办法吗?
【问题讨论】:
-
类型推导也需要定点。但它无条件地适用于两个 return 语句。
标签: c++ templates functional-programming template-argument-deduction y-combinator