如果我从函数参数中删除const
,则clang会抛出错误。此错误与缺少const
的组合仅出现在ref变量中。发生了什么事?
vector<string> v = {"the", "quick", "brown", "fox"};
bool compareWords(const string & s1, const string & s2)
{
return s1.size() < s2.size();
}
stable_sort(v.begin(), v.end(), compareWords);
答案 0 :(得分:1)
这可以帮助您确保不修改比较器的参数。
如果要在排序操作期间修改正在排序的元素,那么比较器可能会返回不一致的结果,这会破坏排序算法 - 可能产生无限的不良影响(“未定义的行为”)。
答案 1 :(得分:1)
将string & s1
描述为没有const
的参数意味着您将在调用函数中更改基础值。但是,该值是函数的返回值 - 它不存储在任何地方,也不能更改。
(好吧,由于某些编译器魔法它存储在某个地方,但调用函数无法访问该位置,所以你仍然暗示你想要做一些你不能做的事情)
答案 2 :(得分:1)
严格来说,
bool compareWords(string & s1, string & s2)
{
return s1.size() < s2.size();
}
应该有效。 compareWords
的唯一要求是它不应该修改参数。
以下是http://en.cppreference.com/w/cpp/algorithm/stable_sort
的一些信息比较函数的签名应等同于以下内容:
bool cmp(const Type1 &a, const Type2 &b);
签名不需要
const &
,但函数对象不得修改传递给它的对象。
但是,有些编译器认为参数应该是const &
或者只是对象。
答案 3 :(得分:0)
根据C ++标准
假设comp不会应用任何非常数函数 通过解除引用的迭代器。
因此,要提供此限制,解除引用的迭代器的对象将被视为const引用。