C++中宇宙飞船运算符<=>是否可以用于折叠表达式?
结论先行:这是C++标准的有意设计,并非编译器未实现
核心原因如下:
- 三向比较运算符
operator<=>的返回值不是布尔类型,而是std::strong_ordering、std::weak_ordering这类比较类别类型,本身不支持直接和数值类型做三向比较。你给出的示例代码template <int ...a> bool foo() { return (a<=> ... <=>0); }如果按照折叠表达式规则展开,比如参数包有2个元素时会变成a1 <=> (a2 <=> 0),其中a2 <=> 0返回的是比较类别,和a1的int类型完全不匹配,本身就不可能正常运行,没有实用语义。 - 标准在C++20引入三向比较运算符时,就明确没有把它加入折叠表达式的支持运算符列表,就是因为不存在合理的通用折叠场景,没必要额外增加语法支持。
关于你猜测的「其他比较运算符会被移除折叠支持」,完全不可能发生:
- 首先C++的核心设计原则是保持向后语法兼容,不会主动移除已经支持的语法特性,哪怕实际使用频率很低。
- 其次
<=,>=,==,!=,<,>这些比较运算符虽然直接折叠的语义很反直觉(比如(a < ... < 0)展开后不是判断所有a都小于0,而是链式比较运算的结果,几乎没有实用价值),但开发者可以将比较运算和逻辑运算符结合写折叠表达式,比如((a < 0) && ...)这种判断所有元素都小于0的写法是被广泛使用的,语法层面的支持是有意义的。
内容的提问来源于stack exchange,提问作者PiotrNycz
相关产品推荐
相关产品推荐

