为什么不能将非常量参数函数与stable_sort()一起使用?

时间:2018-06-28 04:21:37

标签: c++

#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;

bool foo(string&s1, string&s2);

int main(int args, char *argv[])
{
    istringstream istrm("counts elements for which predicate p returns");
    vector<string> vec;
    string word;
    while (istrm >> word) {
        vec.push_back(word);
    }

    stable_sort(vec.begin(), vec.end(), foo); //Conversion Error
    //sort(vec.begin(), vec.end(), foo); //Using sort is also OK.

    //Below is OK.
    //int size_num = 7;
    //auto num = count_if(vec.begin(), vec.end(), [size_num](string &s1) {
    //  return s1.size() > size_num;
    //});
    //cout << num;
} 

bool foo(string&s1, string&s2) {
    return s1.size() < s2.size();
}

在将非常量参数函数传递给stable_sort时遇到转换错误,但是count_if很好。

cppreference开始,使用非常量参数函数似乎完全可以。

  

比较功能的签名应等效于以下内容:
   bool cmp(const Type1 &a, const Type2 &b);
  签名不需要具有 const&,但是功能对象不得修改传递给它的对象。

我在这里做什么错了?

PS:那么algorithm中的函数会将什么类型的对象传递给谓词?只有1个}}?只有1个}}?还是两者都可以?

1 个答案:

答案 0 :(得分:7)

这当前是标准中的缺陷,请参见LWG 3031

在某些情况下,现有的主要实现不适用于此类比较器,并且标准尚不清楚其是否应工作。

相似的问题:Is Comp comparator used in STL required to never change compared objects in STL?