C++中自定义比较器为何必须添加const修饰符?
为什么C++中upper_bound的自定义比较器必须用const引用?
你遇到的编译错误,本质是C++标准库算法的参数要求和类型匹配规则导致的,具体原因如下:
标准库算法的参数约束:
upper_bound这类标准库算法在调用自定义比较器时,会把容器内的元素、以及你传入的newInterval当作不可修改的const对象来传递。如果你的比较器参数没有加const,就会出现类型不兼容——C++不允许把const引用绑定到非const引用上,编译器自然会报错。类型匹配的硬性规则:当你写
vector<int>& a这种非const引用参数时,意味着这个参数可以被修改,但upper_bound传递过来的是带const属性的对象,两者的权限不匹配(const对象的读写权限更低,不能赋值给权限更高的非const引用),这是C++类型系统的硬性限制。编程习惯的必要性:加
const不仅是为了通过编译,还能明确告诉编译器和其他开发者:这个比较器不会修改传入的区间对象,同时也避免了不必要的对象拷贝(用引用传递比值传递更高效)。
举个直观的例子,如果你去掉const写成这样:
auto comp = [](vector<int>& a, vector<int>& b) { return a[0] < b[0]; };
upper_bound内部会尝试把intervals里的元素(作为const对象)传给这个lambda的参数a,但const的vector<int>无法绑定到非const的vector<int>&,这就触发了编译错误。
内容的提问来源于stack exchange,提问作者Yuan
相关产品推荐
相关产品推荐

