为什么在为 STL 定义仿函数时必须使用 const& 参数?
Why must I use a const& parameter when defining a functor for STL?
auto cmp = [](pair<int, int> & left, pair<int, int> & right){if(left > right) return true; else return false;};
multiset<pair<int, int>, decltype(cmp)> mt(cmp);
// If I just compile the two lines above, it will work.
// But if I try to insert some elements as below, I'll get errors.
//mt.insert({0, 3});
//mt.insert({1, 1});
但是,如果我为 cmp
的两个参数添加 const
或删除 &
,它将起作用。
当我尝试将元素插入 mt
时,为什么我不能对 cmp
使用非 const
引用?
根据 cppreference,cmp must meet the requirements of Compare。
Compare 的参考说:
As with any BinaryPredicate, evaluation of that expression is not allowed to call non-const member functions of the dereferenced iterators.
为了防止比较器意外更改存储元素的状态,您需要使用常量引用或通过复制获取值。
编译器认为您可能会更改传递给 cmp
函数的参数,因为您已经为输入参数指定了引用。但是,您拥有的 insert
语句正在传递无法修改的常量(编译器知道这一点)。因此不匹配。
如果您分配两个变量,然后将变量传递给您的 insert()
调用,是否有效?
auto cmp = [](pair<int, int> & left, pair<int, int> & right){if(left > right) return true; else return false;};
multiset<pair<int, int>, decltype(cmp)> mt(cmp);
// If I just compile the two lines above, it will work.
// But if I try to insert some elements as below, I'll get errors.
//mt.insert({0, 3});
//mt.insert({1, 1});
但是,如果我为 cmp
的两个参数添加 const
或删除 &
,它将起作用。
当我尝试将元素插入 mt
时,为什么我不能对 cmp
使用非 const
引用?
根据 cppreference,cmp must meet the requirements of Compare。
Compare 的参考说:
As with any BinaryPredicate, evaluation of that expression is not allowed to call non-const member functions of the dereferenced iterators.
为了防止比较器意外更改存储元素的状态,您需要使用常量引用或通过复制获取值。
编译器认为您可能会更改传递给 cmp
函数的参数,因为您已经为输入参数指定了引用。但是,您拥有的 insert
语句正在传递无法修改的常量(编译器知道这一点)。因此不匹配。
如果您分配两个变量,然后将变量传递给您的 insert()
调用,是否有效?