C++中给std::function参数设置lambda默认值不生效的原因是什么
问题根因
- 参数类型与默认值签名不兼容:你定义的
comparison参数类型为std::function<bool()>,代表无参数、返回布尔值的可调用对象;但你设置的默认lambda签名为[](auto a, auto b)->bool{return a < b;},需要接收两个输入参数,二者签名完全不匹配,编译器无法将该lambda作为合法默认值绑定到参数上,所以省略参数时会直接报错。 - 显式传参可运行的原因:你手动传入的
[](){return 1;}是无参lambda,刚好符合std::function<bool()>的签名要求,因此可以正常绑定。
从代码逻辑来看,你在调用find_median_unsorted时传入了comparison参数,说明该比较器是用来比对两个元素大小的二元可调用对象,本身的参数类型定义就不符合业务需求。
修复方案
方案1:修正std::function签名
将comparison的类型修改为匹配二元比较器的签名即可:
template<typename T> decltype(auto) find_median( T begin, T end, bool sorted = false, // 修正为接收两个元素类型参数的function签名 const std::function<bool(decltype(*begin), decltype(*begin))> comparison = [](auto a, auto b)->bool{return a < b;}) { assert(begin != nullptr); assert(end != nullptr); return sorted ? find_median_sorted(begin, end) : find_median_unsorted(begin, end, comparison); }
方案2:使用模板参数作为比较器类型(更优)
直接新增比较器模板参数,避免std::function的类型擦除开销,灵活性更高:
template<typename T, typename Comparator = std::less<>> decltype(auto) find_median( T begin, T end, bool sorted = false, Comparator comparison = {}) { assert(begin != nullptr); assert(end != nullptr); return sorted ? find_median_sorted(begin, end) : find_median_unsorted(begin, end, comparison); }
内容的提问来源于stack exchange,提问作者beep_boop
相关产品推荐
相关产品推荐

