太空船操作符能在折叠表达式中使用吗?

14

我尝试过的所有编译器都不接受这样的代码:

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

但对于任何其他<=,>=,==,!=,<,>都可以编译通过。

cppreference清楚地表明,我们无法在fold表达式中使用<=>二元运算符。

这是C++标准有意省略的,还是编译器还没有准备好?

这只是出于好奇,我只想知道C++在这个领域的方向。我可以想象,除了<=>之外的所有比较运算符都将从允许的fold表达式运算符列表中删除,因为它们和<=>在fold表达式中一样毫无意义...


8
但对于任何其他的<=,>=,==,!=,<,>运算符,它都有效。已经有提议从折叠表达式中删除所有比较运算符,因为它们的含义非常不直观。在第一次比较之后,您将比较所有其他值与一个布尔值。 - Drew Dormann
我想知道:return (a<=> ... <=>0);的结果应该是什么?它应该生成什么样的代码?你能提供一个有意义的<=的工作示例吗? - Marek R
6
对于任何其他的<=,>=,==,!=,<,>,它都能正常运行。我不会说它“能正常运行”,而是说它仅仅编译通过。 - Barry
1个回答

16

这是有意为之。

使用折叠展开比较运算符的问题在于它通过执行以下操作来实现:A < B < C < D。 这只在operator<被重载以表示除比较以外的其他含义的情况下才有意义。 这就是为什么有人试图阻止C++17首次允许您对它们进行折叠的原因

operator<=> 永远不应该用于比较以外的任何事情。 因此,它是被禁止的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接