【问题标题】:C++20 default equality / inequalityC++20 默认相等/不等式
【发布时间】:2020-10-29 15:31:53
【问题描述】:

C++20 为我们提供了 spaceship 运算符,甚至允许我们 default 它,生成所有与默认语义的比较,这将从我们的代码库中删除大量样板,太棒了!

但是平等和不平等呢? C++20 是否也为我们提供了default 相等和不等式的方法? 根据cppreference.com,默认宇宙飞船只会给我们<<=>>=,而不是==!=。鉴于我通常比更大/更少更频繁地需要相等/不等式方式,这似乎很不幸。 那么,有没有办法在 C 中也(或仅)默认生成 ==!= ++20?

更新:该页面现在包含默认 operator== 的描述。似乎我在添加此文档的两个小时前访问了该页面。 :D

【问题讨论】:

  • 我认为答案是here
  • 该页面显示:“此部分不完整原因:默认相等比较”。

标签: c++ c++20


【解决方案1】:

C++20 是否也为我们提供了一种默认相等和不等式的方法?

是的(但请参阅最后一段)。语法相同:

friend bool operator==(const T&, const T&) = default;
friend bool operator!=(const T&, const T&) = default; // not needed if == exists

有序不等式也可以默认:

friend bool operator<=(const T&, const T&) = default;
// ...

默认宇宙飞船只会给我们&lt;&lt;=&gt;&gt;=,但不会给我们==!=

这是不准确的。默认三路比较给了我们所有的比较所以,在这种情况下,上面不需要。

【讨论】:

  • 你不需要第二行。
  • @NathanOliver 无论如何,这是允许的。
  • 我不确定这是否正确。不是必须是成员operator== 才能被默认吗?
  • @gexicide Defaulting == 今天似乎已添加到 cppreference 中,以及 "根据任何运算符 重载的规则,默认的 重载也将允许与 和 >= 比较的类型。如果 operator 是默认的,并且根本没有定义 operator==,那么 operator== 也被认为是默认的。"
猜你喜欢
  • 2021-05-11
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多