由比较部件的std ::元组成员发生故障(std::tuple member by member c

2019-10-30 04:32发布

我想测试这个非常有趣的答案 ,并与这个最小的实现就出来了:

class A
{
    enum M { a };
    std::tuple<int> members;

public:

    A() { std::get<M::a>(members) = 0; }
    A(int value) { std::get<M::a>(members) = value; }
    A(const A & other) { members = other.members; }

    int get() const { return std::get<M::a>(members); }

    bool operator==(A & other) { return members == other.members; }
};

和一个简单的测试:

int main() {

    A x(42);
    A y(x);

    std::cout << (x==y) << std::endl;

    return 0;
}

一切都很好,直到我定义了一个简单的struct B {}; 并尝试添加它的一个实例作为成员。 当我写的

std::tuple<int, B> members;

operator==是不正常了,我从编译器(gcc 5.4.1)得到这个消息:

error: no match for ‘operator==’ (operand types are ‘std::__tuple_element_t<1ul, std::tuple<int, B> > {aka const B}’ and ‘std::__tuple_element_t<1ul, std::tuple<int, B> > {aka const B}’)
  return bool(std::get<__i>(__t) == std::get<__i>(__u))
                                 ^

我想提供一个operator==B

struct B
{
    bool operator==(const B &){ return true; }
};

并有来自编译器的一个额外的:

candidate: bool B::operator==(const B&) <near match>
     bool operator==(const B &){ return true; }
          ^

谁能解释什么是错的为B结构? 难道缺了点什么,要不?

Answer 1:

这是最终const正确性。 你没有资格的const B的(或A的,对于这个问题)相比,运营商和它的参数一致。

由于元组的operator==接受一个const引用,它不能使用常量,不正确实施。 和重载解析失败的后果。

整理所有这些常量预选赛解决所有的错误 。



文章来源: std::tuple member by member comparison fails
标签: c++ stdtuple