将const对象引用传递给仿函数

时间:2017-05-09 23:22:27

标签: c++ c++14

我想为std :: functions创建一个输入事件对象的映射。输入事件对象定义了==运算符,但由于map默认使用<检查是否相等并且我的用法不需要​​排序,我想将compare函数设置为调用==运算符的仿函数。基本上,我想这样做:

#include <map>

struct Vertex
{
    int x;
    int y;

    constexpr bool operator==(const Vertex& v)
    {
        return (x == v.x) && (y == v.y);
    }
};

struct vertexCmp
{
    bool operator()(const Vertex& v1, const Vertex& v2)
    {
        return v1 == v2;
    }
};

int main()
{
    std::map<Vertex, int, vertexCmp> _vertexMap;

    Vertex v;
    v.x = 1;
    v.y = 1;

    _vertexMap[v] = 1;

    return 0;
}

但是,我收到以下编译器错误:

main.cpp||In member function ‘bool vertexCmp::operator()(const Vertex&, const Vertex&)’:|
main.cpp|21|error: passing ‘const Vertex’ as ‘this’ argument discards qualifiers [-fpermissive]|
main.cpp|11|note:   in call to ‘constexpr bool Vertex::operator==(const Vertex&)’|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

我知道你不能在const对象上调用非const成员函数,但你会认为constexpr会满足那个要求吗?我觉得我在这里过分思考我的方法,并且有更好的方法来构建它。

1 个答案:

答案 0 :(得分:4)

在C ++ 11中,非静态成员函数上的constexpr隐含了const函数,但在C ++ 14中却没有(因为发现函数实际上有用例)那是constexpr,其中*this不是const)。你需要

constexpr bool operator==(const Vertex& v) const