在下面的示例代码中,重载运算符<不是const限定的,它在Visual C ++下编译(所有版本直到2013 Preview),但在Clang下,它会抛出一个错误 - 注意:候选函数不可行:'this'参数的类型为'const Entry',但方法是没有标记const bool运算符<(const Entry& other)。
#include "stdafx.h"
#include <vector>
#include <algorithm>
struct Entry
{
unsigned int age;
bool operator<( const Entry& other ) // !!! no const qualification here !!!
{
return age < other.age;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<Entry> entries;
for( unsigned int i = 0; i < 100; ++i )
{
Entry entry;
entry.age = i;
entries.push_back( entry );
}
// Sort by age
std::sort( entries.begin(), entries.end() );
return 0;
}
在强制执行比较/关系运算符的const正确性时,Visual C ++是否符合标准?或者这与std :: sort?
有关答案 0 :(得分:3)
C ++标准声明假设不会通过解除引用的迭代器应用非常量函数,首先通过可以传递给Compare
的{{1}}仿函数来说明它:
sort
是一个函数对象类型(20.8)。应用于对象的函数调用操作的返回值 类型Compare
,当上下文转换为bool(4)时,如果调用的第一个参数是,则返回true 小于第二个,否则为假。Compare
Compare
始终用于假定a的算法 订购关系。 假设comp
不会通过解除引用来应用任何非常量函数 迭代器强>
(强调我的)
然后,通过陈述comp
和Compare
:
对于采用
operator<
的所有算法,都有一个使用Compare
的版本。也就是说,operator<
默认为comp(*i, *j) != false
。对于除25.4.3中描述的算法之外的算法 正确地说,*i < *j != false
必须对值进行严格的弱排序。
两个引用来自。来自 25.4排序和相关操作。
所以,虽然没有明确说明成员comp
必须是operator<
,但假设它必须是const
。对comp
而不是operator<
进行限制是没有意义的。
我会说Visual C ++在这里有问题,因为它允许在解引用的迭代器上调用非const函数。