可以在折叠表达式中使用宇宙飞船运算符吗?
我试过的编译器都没有接受这样的代码:
template <int ...a> bool foo() { return (a<=> ... <=>0); }
但对于任何其他<=,>=,==,!=,<,>它编译。
cppreference在这里很清楚 -<=>我们可以用于折叠表达式的二元运算符列表中没有。
这是 C++ 标准中的故意遗漏,还是编译器没有准备好?
这个问题只是纯粹的好奇;我只是想知道这方面的 C++ 方向是什么。我可以想象所有其他比较运算符将从允许的运算符的折叠表达式列表中删除,因为它们与<=>折叠表达式一样有意义......
回答
这是故意的。
与折叠式扩张比较运营商的问题是,它的工作原理是这样:A < B < C < D。这仅在operator<重载以表示比较以外的其他内容的情况下才有意义。这就是为什么首先试图阻止 C++17 允许您折叠它们的原因。
operator<=>是永远应该被用于除比较以外的东西。所以是禁止的。