能否直接以std::max作为参数调用std::partial_sum计算部分最大值?
为什么直接传
std::max给std::partial_sum会编译失败? 直接写std::partial_sum(nums.begin(), nums.end(), pmax.begin(), std::max);会编译报错,核心原因是**std::max存在多个重载版本**:
- 标准库中
std::max有针对任意可比较类型的模板版本,还有接受初始值的重载,编译器没办法自动推断你要传递的是哪个重载,产生了函数匹配歧义。
而你用lambda包装的写法[](int a, int b) { return std::max(a, b); }能成功,是因为lambda的参数类型明确,编译器可以确定内部调用的std::max版本,同时lambda本身是一个唯一的闭包类型,不存在重载歧义问题。
除了lambda,还有其他可行写法吗?
当然有,你可以显式指定std::max的模板参数,或者强制转换为对应的函数指针类型,让编译器明确选择哪个重载:
- 显式指定模板参数:
std::partial_sum(nums.begin(), nums.end(), pmax.begin(), std::max<int>);
- 强制转换为函数指针:
std::partial_sum(nums.begin(), nums.end(), pmax.begin(), static_cast<int(*)(int, int)>(std::max));
这两种写法都能绕过重载歧义的问题,和lambda版本效果一致。
内容的提问来源于stack exchange,提问作者weeb
相关产品推荐
相关产品推荐

