为什么C++编译器在参数中不使用常量时无法编译

Why does C++ compiler fail to compile when not using a const in a parameter?

本文关键字:常量 编译 编译器 C++ 参数 为什么      更新时间:2023-10-16

我正在尝试返回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值,可能没有太大的性能差异,但隐式转换很容易成为主要的性能问题,例如,当键或值包含某种形式的容器时。