C++ 为什么我能';没有常数就不能定义比较

C++ 为什么我能';没有常数就不能定义比较,c++,compiler-construction,g++,C++,Compiler Construction,G++,如果我这样定义我的compare函数: bool compare(Student& a, Student& b) { return a.n < b.n; } 您应该将其设置为常量,因为它使两个参数保持相同。在这个实现中,std::sort使用 const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&, _Compare); 在您的情况下,\u Tp是学生,\u Com

如果我这样定义我的
compare
函数:

bool compare(Student& a, Student& b)
{
    return a.n < b.n;
}

您应该将其设置为常量,因为它使两个参数保持相同。

在这个实现中,
std::sort
使用

 const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&, _Compare);
在您的情况下,
\u Tp
是学生,
\u Compare
比较

所以你基本上有

const Student& std::__median(const Student&, const Student&, const Student&, 
                                                   bool (*)(Student&, Student&) )
或类似的。显然,如果参数被转换为
const
,则回调不能应用于参数,因此失败


将参数设置为您的
compare
方法
const

我认为标准中没有要求函数的参数必须为const,因此我认为您拒绝该参数的实现是错误的。但是,要求函数不修改参数:

来自标准--25.4/2

比较是一种函数对象类型(20.8)。的返回值 应用于Compare类型的对象的函数调用操作,当 上下文转换为bool(4),如果第一个参数 调用的值小于第二个,否则为false。比较公司 始终用于假定排序关系的算法。它是 假设comp不会通过 解引用迭代器

以及25.4.1.1中的
std::sort
签名

template<class RandomAccessIterator, class Compare>
void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp)
模板
无效排序(首先是RandomAccessIterator,最后是RandomAccessIterator,比较比较比较)

因此,由于不允许您的函数修改其参数,它确实应该将它们作为常量接受,但标准并不要求这样做。因此,虽然您的实现可能有错误,但我认为这是一个可以原谅的错误,因为它设法让人们注意到这样一个事实:要么您的函数通过修改其参数违反了标准,要么它不是const正确的。

为什么您希望它在没有const的情况下工作?这是“Accelerlated C++”中的一个练习基本上要求我从另一个函数的参数中删除一个
const
,然后看看还有什么需要修改的。通过简单地查找STD API,看起来不像
compare
本身需要`const参数。是的-很抱歉从未注意到这一点。嗨,Luchina,我如何找到STD::sort的信息,查看源代码?哪一个?@pstar您可以在
/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/include/g++-v4/bits/stl_algo.h
中查找。但是我从错误消息中得到了所有这些。但是我在
stl_algo.h
的参数签名中找不到
median
函数和
const
,在错误消息中也找不到。@pstar实际上我在这里分析代码-。但这是相似的。@pstar:在你的情况下,罪魁祸首实际上是
const Student& std::__median(const Student&, const Student&, const Student&, 
                                                   bool (*)(Student&, Student&) )
template<class RandomAccessIterator, class Compare>
void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp)