为什么C++编译器在参数中不使用常量时无法编译
Why does C++ compiler fail to compile when not using a const in a parameter?
我正在尝试返回std::map
的最大值。
int main() {
int N;
cin >> N;
map<int,int > m;
while(N--) {
int x; cin >> x;
m[x]++;
}
cout << max_element(m.begin(), m.end(), pred)->first;
return 0;
}
如果我这样定义pred
,它可以工作:
bool pred(const pair<int,int>& lhs, const pair<int,int>& rhs){
return lhs.second < rhs.second;
}
然而,这不起作用:
bool pred(pair<int,int>& lhs, pair<int,int>& rhs){
return lhs.second < rhs.second;
}
我不明白为什么const
允许它工作。
std::map<K, V>
的值类型不是std::pair<K, V>
而是std::pair<K const, V>
:你不能改变std::map<K, V>
元素的键。您应该为 pred()
函数的参数使用正确的值类型:
bool pred(std::pair<int const, int>& lhs, std::pair<int const, int>& rhs) { ... }
或者,最好
bool pred(std::map<int, int>::reference lhs, std::map<int, int>::reference rhs) { ... }
pred()
函数不会更改参数。相应地,它可以而且可能也应该接受const&
的参数,因为这允许使用std::map<K, V> const
。但是,当仅将函数与非const
映射一起使用时,假设它使用正确的值类型,则不需要这样做。
由于std::pair
具有来自其他std::pair
类型的转换运算符,因此它可以[隐式]从std::pair<int const, int>
转换为std::pair<int, int>
。但是,结果是临时std::pair<int, int>
不能绑定到非const
引用。对于一对int
值,可能没有太大的性能差异,但隐式转换很容易成为主要的性能问题,例如,当键或值包含某种形式的容器时。
相关文章:
- C++常量数组的编译时间较长
- 在编译时将常量字符* 转换为常量 char_type*
- 将编译时常量向量转换为堆分配版本
- 如何在常量计算表达式中获取编译时错误?
- 如何在编译时解析静态常量 std::string?
- 有没有办法在类实例中存储编译时常量?
- 检测编译时文本和常量
- ARM C++编译器不会编译具有可变常量成员的结构
- 强制在编译时计算类的类的常量成员
- Constexpr 类采用常量引用不编译
- 为什么对数组的常量左值引用不编译在下面?
- 由于缺少常量而出现编译错误
- 为什么在将常量 ptr 分配给常量引用时没有收到编译错误?
- 为什么可以在编译时访问非常量、非静态成员而无需类的实例
- 不是 VS2017 中的编译时常量表达式
- 将编译时定义大小的数组初始化为常量表达式
- 将大小为编译时常量的数组初始化为单个值
- 如何为 std::array 声明全局编译时常量?
- 返回非常量引用编译的 Const 方法
- 常量正确性编译错误到模板函数中的无效转换错误