gpt4 book ai didi

c++ - C++ 20比较: warning about ambiguous reversed operator

转载 作者:行者123 更新时间:2023-12-01 12:28:44 37 4
gpt4 key购买 nike

考虑以下有效的C++ 17示例:

struct A {
bool operator==(const A&);
};


int main() {
return A{} == A{};
}

compiled in clang with -std=c++20 it gives时:

<source>:7:15: warning: ISO C++20 considers use of overloaded operator '==' (with operand types 'A' and 'A') to be ambiguous despite there being a unique best viable function [-Wambiguous-reversed-operator]

return A{} == A{};

~~~ ^ ~~~

<source>:2:9: note: ambiguity is between a regular call to this operator and a call with the argument order reversed

bool operator==(const A&);

此警告是否表示C++ 20不允许使用典型的比较运算符比较两个相同类型的对象?正确的选择是什么?将来的草稿中情况会有所改变吗?

最佳答案

Does this warning mean that C++20 disallows using a typical comparison operator to compare two objects of the same type? What is the correct alternative? Is the situation expected to change in future drafts?



这实际上不是典型的比较运算符,它已经有点不对了-因为它只允许一侧上的 const对象(即使不进行任何语言更改,您的 A类型也不满足新的 equality_comparable概念)。

您必须这样写:
struct A {
bool operator==(const A&) const;
// ^^^^^^
};

这是C++ 20的最终规则。

特定的问题是在C++ 20中,比较运算符添加了新的概念,即重写和逆向候选。因此,查找表达式 a == b还将最终匹配匹配运算符,例如 b == a。在典型情况下,这意味着您必须编写更少的运算符,因为我们知道相等是可交换的。

但是,如果您存在const不匹配的情况,那么您将遇到以下两个候选对象:
bool operator==(/* this*/ A&, A const&); // member function
bool operator==(A const&, /* this*/ A&); // reversed member function

具有 A类型的两个参数。第一个参数在第一个参数上更好,第二个参数在第二个参数上更好。哪一个候选人都不比另一个更好,因此模棱两可。

关于c++ - C++ 20比较: warning about ambiguous reversed operator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60386792/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com