3

在下面的示例代码中,重载的 operator< 不是 const 限定的,它在 Visual C++ 下编译(所有版本到 2013 预览版),但在 Clang 下,它会抛出一个错误 - 注意:候选函数不可行:'this' 参数具有类型“const Entry”,但方法未标记为 const bool operator<( 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 有关?

4

1 回答 1

3

C++ 标准规定,假定不会通过取消引用的迭代器应用非常量函数,首先通过Compare可以传递给的函子来说明它sort

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

(强调我的)

然后,通过说明 和 之间的Compare关系operator<

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

这两个报价都来自 . 来自25.4 排序和相关操作

因此,尽管没有明确说明成员operator<必须是const,但假设它是意味着它必须是。对 .施加限制comp而不对operator<.

我想说 Visual C++ 在这里有问题,因为它允许在取消引用的迭代器上调用非常量函数。

于 2013-07-13T16:05:29.033 回答