为什么mutable lambda无法推导函数签名?如何适配现有memoize实现?
错误原因
现有代码的memfun_type模板仅对带const限定的类成员函数指针做了特化,而添加mutable修饰的lambda,其重载的operator()是不带const限定的,无法匹配到已有的特化分支,只能命中默认模板定义,得到的type别名是void,进而触发返回值类型不匹配的编译错误。
最小修复方案
仅需为memfun_type新增一个针对非const成员函数指针的特化分支即可,无需修改其他现有逻辑:
// 在原有memfun_type的const特化之后,新增如下特化 template<typename Ret, typename Class, typename... Args> struct memfun_type<Ret(Class::*)(Args...)> { using type = std::function<Ret(Args...)>; };
添加后即可同时兼容普通lambda和mutable lambda,编译运行均符合预期。
内容的提问来源于stack exchange,提问作者bradgonesurfing
相关产品推荐
相关产品推荐

