Visual C ++关系运算符重载const正确性(使用std :: sort)

时间:2013-07-13 15:41:00

标签: c++ operator-overloading const-correctness

在下面的示例代码中,重载运算符<不是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?

有关

1 个答案:

答案 0 :(得分:3)

C ++标准声明假设不会通过解除引用的迭代器应用非常量函数,首先通过可以传递给Compare的{​​{1}}仿函数来说明它:

  

sort是一个函数对象类型(20.8)。应用于对象的函数调用操作的返回值   类型Compare,当上下文转换为bool(4)时,如果调用的第一个参数是,则返回true   小于第二个,否则为假。 Compare Compare始终用于假定a的算法   订购关系。 假设comp不会通过解除引用来应用任何非常量函数   迭代器

(强调我的)

然后,通过陈述compCompare

之间的关系
  

对于采用operator<的所有算法,都有一个使用Compare的版本。也就是说,operator<默认为comp(*i, *j) != false。对于除25.4.3中描述的算法之外的算法   正确地说,*i < *j != false必须对值进行严格的弱排序。

两个引用来自。来自 25.4排序和相关操作

所以,虽然没有明确说明成员comp必须是operator<,但假设它必须是const。对comp而不是operator<进行限制是没有意义的。

我会说Visual C ++在这里有问题,因为它允许在解引用的迭代器上调用非const函数。