我想测试this very interesting answer并推出了这个最小的实现:
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结构的错误吗?是否缺少某些东西,或者其他?
答案 0 :(得分:5)
它最终是正确的。您没有使B
(或A
&#39; s(或 var commentJson = '{"body" : “adding comment to the task from client side javascript code”}';
&#39; s)的比较运算符及其参数一致。
由于tuple's operator==
接受const引用,因此它不能使用const-wrong实现。因此,重载决策失败了。
整理所有const限定符resolves all the errors。