参见英文答案 >
Can we use a lambda-expression as the default value for a function argument?1个
我想做一件简单的事:
我想做一件简单的事:
void DoUntil(auto predicate = [] { return false; });
显然这不起作用 – 我必须使用模板参数:
template <typename P> void DoUntil(P predicate = [] { return false; });
error: no matching function for call to …
note: candidate template ignored: Couldn’t infer template argument ‘P’
int main() { DoUntil(); }
我不想使用std :: function<>以任何方式.
我的问题还有其他可能的解决方案吗?
解决方法
使用函数重载而不是默认参数功能.创建一个非模板函数,除模板函数外不带任何参数:
void DoUntil() ; template <typename P> void DoUntil(P predicate) ;
无参数版本可以简单地使用您要用作默认谓词的lambda来调用模板版本:
void DoUntil() { DoUntil([] { return false; }); }
原始方法的问题在于,您尝试通过指定默认参数值来提供默认模板特化,但不指定默认模板类型.即使不涉及lambdas,以下也不会起作用,因为T没有默认类型,即使t具有默认值:
template <typename T> void Foo(T t = 3);
需要的是使用< typename T = int>指定T的默认类型.
如WhiZTiM的回答所述,涉及lambda函数的案例的默认类型必须使用decltype推导出来.这当然是因为lambdas具有只有编译器才知道的唯一类型.
原文地址:https://www.jb51.cc/c/111391.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。