【问题标题】:Can spaceship operator be used in fold expressions?可以在折叠表达式中使用宇宙飞船运算符吗?
【发布时间】:2021-10-11 10:57:09
【问题描述】:

tried 的编译器都不接受这样的代码:

template <int ...a> bool foo() { return (a<=> ... <=>0); }

但对于任何其他<=,>=,==,!=,<,>,它都会编译。

cppreference 在这里很清楚 - 我们可用于折叠表达式的二元运算符列表中没有 <=>

这是 C++ 标准中的故意遗漏,还是编译器没有准备好?

这个问题只是纯粹的好奇;我只是想知道这个领域的 C++ 方向是什么。我可以想象所有其他比较运算符都将从允许运算符的折叠表达式列表中删除,因为它们在折叠表达式中与 <=> 一样有意义......

【问题讨论】:

  • "但是对于任何其他<=,>=,==,!=,<,> 它都有效。" It has been proposedall 比较运算符从折叠表达式中删除,因为它们的含义非常不直观。在第一次比较之后,您需要将所有其他值与 bool 进行比较。
  • 我想知道:return (a<=> ... <=>0); 的结果应该是什么?它应该生成什么样的代码?您能否为<= 提供有意义的工作示例?
  • “但对于任何其他<=,>=,==,!=,<,>,它有效。”我不会说它有效,我会说它只是编译。

标签: c++ language-lawyer c++20 fold-expression spaceship-operator


【解决方案1】:

这是故意的。

折叠扩展比较运算符的问题在于它通过以下方式工作:A < B < C < D。这仅在operator< 被重载以表示 比较的情况下才有意义。这就是为什么an attempt was made to stop C++17 from allowing you to fold over them in the first place

operator<=> 从不应该用于比较以外的其他用途。所以是禁止的。

【讨论】:

    猜你喜欢
    • 2011-03-04
    • 2010-10-24
    • 2021-08-07
    • 1970-01-01
    • 2021-07-27
    • 2020-09-28
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多