【发布时间】:2021-01-15 16:43:14
【问题描述】:
在 C++20 中有一些关于重写比较运算符的新规则,我试图了解它们是如何工作的。我遇到了以下program:
struct B {};
struct A
{
bool operator==(B const&); // #1
};
bool operator==(B const&, A const&); // #2
int main()
{
B{} == A{}; // C++17: calls #2
// C++20: calls #1
}
这实际上破坏了现有代码。我对此感到有些惊讶; #2 实际上对我来说还是更好看:p
那么这些新规则如何改变现有代码的含义?
【问题讨论】:
-
哪个编译器?其他编译器做同样的事情吗?如果您删除两种语言版本的任一定义,会发生什么情况?
-
@1201ProgramAlarm gcc 和 clang 据我所知具有一致的行为。在两个版本中删除
#1调用#2并删除#2无法在 c++17 中编译,这两者都不是重大更改。我认为这两个结果都是预期的。 -
这似乎是因为
[over.match.oper]中的内容(第 12.4.1.2 节 N4849 中的表达式中的运算符)。特别是关于 rewritten Candidates 的段落都是新的,并且其中的措辞似乎允许使用y==x(反转操作数)。我不确定答案中应该包含多少。 -
@1201ProgramAlarm 你说得对,我实际上并不想要具体的规则本身,我可以解决这个问题。更我不明白 为什么
#1是更好的选择。我不知道如何改写这个问题。 -
@1201ProgramAlarm 好的,稍微编辑一下问题。现在只需要解释为什么程序的行为发生变化所需的规则,需要在答案中。
标签: c++ language-lawyer c++20 comparison-operators