C++使用大括号替代make_pair调用lower_bound时报错如何解决?
报错根因
这个问题是C++模板参数推导的规则限制导致的,和pair本身的大括号构造能力无关。
标准库中lower_bound的核心签名如下:
template< class ForwardIt, class T > ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value );
第三个参数value的类型T属于需要编译器从实参推导的模板参数,推导规则明确限制:花括号初始化列表({...}语法)不能用于通用模板参数的自动推导,除非模板参数显式声明为std::initializer_list类型。
- 使用
make_pair(2,3)时:make_pair会返回明确的std::pair<int, int>类型对象,编译器可以直接推导出T = std::pair<int, int>,匹配函数签名,编译正常。 - 使用
{2,3}时:{2,3}本身没有确定的类型,编译器无法推导T的具体值,找不到匹配的lower_bound重载,因此抛出参数列表不匹配的报错。
替代写法
如果希望保留大括号初始化的写法,只需要给编译器补充明确的类型提示即可,两种常用方案:
- 显式声明第三个参数的类型
auto ptr = std::lower_bound(a.begin(), a.end(), std::pair<int, int>{2, 3});
- 手动指定
lower_bound的模板参数,跳过自动推导
auto ptr = std::lower_bound<decltype(a.begin()), std::pair<int, int>>(a.begin(), a.end(), {2,3});
内容的提问来源于stack exchange,提问作者user13172816
相关产品推荐
相关产品推荐

