考虑这个有效的 C++17 示例:
struct A {
bool operator==(const A&);
};
int main() {
return A{} == A{};
}
When 使用 -std=c++20 在 clang 中编译它给出 https://godbolt.org/z/QXVEAt:
<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 不允许使用典型的比较运算符来比较相同类型的两个对象?正确的选择是什么?这种情况预计会在未来的草案中有所改变吗?
此警告是否意味着 C++20 不允许使用典型的比较运算符来比较相同类型的两个对象?正确的选择是什么?这种情况预计会在未来的草案中有所改变吗?
这实际上并不是一个典型的比较运算符,它已经有点错误了 - 因为它只允许const
一侧的物体(您的类型A
不能满足新的equality_comparable
概念,即使没有任何语言变化)。
你必须这样写:
struct A {
bool operator==(const A&) const;
// ^^^^^^
};
这是 C++20 的最终规则。
具体问题是,在 C++20 中,比较运算符添加了重写和反转候选的新概念。所以查找表达式a == b
最终也会匹配到像这样的运算符b == a
。在典型情况下,这意味着您必须编写更少的运算符,因为我们知道相等是可交换的。
但如果常量不匹配,最终会出现以下两个候选:
bool operator==(/* this*/ A&, A const&); // member function
bool operator==(A const&, /* this*/ A&); // reversed member function
有两个类型的参数A
。第一个候选者在第一个参数中更好,第二个候选者在第二个参数中更好。两位候选人都不比另一位更好,因此含糊不清。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)