对于不可复制的地图,地图迭代器上不支持等式运算符(==)

时间:2014-03-12 04:05:21

标签: c++ c++11

当我有一个不可复制对象的映射时,为什么我不能使用==来比较迭代器?我想在迭代器上进行相等测试时,不需要复制(或移动)实际对象。

#include <iostream>
#include <utility>
#include <map>

using namespace std;

class A {
private:
    int i;
public:
    A(int i) : i(i) {}
    A(A&) = delete;
    A(A&& a) : i(a.i) {}
    ~A() {}
    A& operator=(A&) = delete;

    bool operator==(const A& a) const { return i == a.i; }
};

int main() {
    map<int, A> myMap;

    map<int, A>::iterator it = myMap.find(1);
    cout << (it == myMap.end()) << endl;
}

此示例无法编译,在cout

的行上出错

g ++给出了这个错误:

/usr/include/c++/4.8.2/bits/stl_pair.h: In instantiation of ‘struct std::pair<const int, A>’:
test2.cpp:24:27:   required from here
/usr/include/c++/4.8.2/bits/stl_pair.h:127:17: error: ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const int; _T2 = A]’ declared to take     const reference, but implicit declaration would take non-const
   constexpr pair(const pair&) = default;

clang ++给出了这个错误:

/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/bits/stl_pair.h:127:17: error: the parameter for this explicitly-defaulted copy constructor is const, but a member or base requires it to be non-const
      constexpr pair(const pair&) = default;
                ^
test2.cpp:24:14: note: in instantiation of template class 'std::pair<const int, A>' requested here
        cout << (it == myMap.end()) << endl;

但是,如果使用map<int, int>代替map<int, A>,它确实有效。使用const map<int, A>map<int, A>::const_iterator无关。

我试着在cppreference上查找map :: iterator :: operator ==的确切签名,(map :: iterator是一个BidirectionalIterator,它是一个ForwardIterator,它是一个InputIterator)但网站是关于概念中确切类型签名的含糊不清。

1 个答案:

答案 0 :(得分:1)

问题在于您删除的方法使A不可复制......

#include <iostream>
#include <utility>
#include <map>

using namespace std;

class A {
private:
    int i;
public:
    A(int i) : i(i) {}
    // A(A&) = delete; should be ...
    A(const A&) = delete;
    A(A&& a) : i(a.i) {}
    ~A() {}
    // A& operator=(A&) = delete; should be ...
    A& operator=(const A&) = delete;

    bool operator==(const A& a) const { return i == a.i; }
};

int main() {
    map<int, A> myMap;

    map<int, A>::iterator it = myMap.find(1);
    cout << (it == myMap.end()) << endl;
}

使用gcc / g ++ 4.6.3验证了这一点

删除&#34; const&#34;从复制构造函数和赋值运算符导致我的编译器给出您收到的相同错误。

我必须查找详细信息/引用,了解为什么会以这种方式声明它们,但是复制构造函数和赋值运算符总是采用const引用(理所当然,因为您的实例被赋值的值不应该通过方法修改。