You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在switch语句中使用C++太空船运算符(<=>)?

问题:C++太空船运算符结果无法用于switch语句

新的<=>运算符能简化代码编写,若比较逻辑复杂还能提升性能——无需重复两次比较即可完成完整排序。但实际在switch语句中使用时却无法正常编译。

无法编译的代码示例:

#include <iostream>

void compare_values(int x, int y)
{
    switch (x <=> y)
    {
    case std::strong_ordering::less:
        std::cout << "is less\n";
        break;
    case std::strong_ordering::greater:
        std::cout << "is greater\n";
        break;
    case std::strong_ordering::equal:
        std::cout << "is equal\n";
        break;
    }
}

编译器报错信息:

<source>: In function 'void compare_values(int, int)':
<source>:5:15: error: switch quantity not an integer
    5 |     switch (x <=> y)
      |             ~~^~~~~
Compiler returned: 1

修复方案

C++20的<=>运算符返回的是比较类别类型(如std::strong_ordering),这类类型并非整数类型,而switch要求条件表达式必须是整数类型(或可隐式转换为整数的类型),因此直接使用返回值会触发编译错误。以下是两种可行的修复方式:

方式1:将比较结果转换为整数

利用比较类别类型可隐式转换为整数的特性,通过static_cast<int>将结果转为整数后传入switch:

#include <iostream>
#include <compare>

void compare_values(int x, int y)
{
    switch (static_cast<int>(x <=> y))
    {
    case static_cast<int>(std::strong_ordering::less):
        std::cout << "is less\n";
        break;
    case static_cast<int>(std::strong_ordering::greater):
        std::cout << "is greater\n";
        break;
    case static_cast<int>(std::strong_ordering::equal):
        std::cout << "is equal\n";
        break;
    }
}

注:std::strong_ordering的枚举值对应整数:less为-1,greater为1,equal为0,转换后可满足switch的类型要求。

方式2:使用if-else链替代switch

若不想进行类型转换,直接用if-else判断比较结果更符合比较类别类型的设计意图,代码也更直观:

#include <iostream>
#include <compare>

void compare_values(int x, int y)
{
    auto cmp = x <=> y;
    if (cmp == std::strong_ordering::less)
        std::cout << "is less\n";
    else if (cmp == std::strong_ordering::greater)
        std::cout << "is greater\n";
    else
        std::cout << "is equal\n";
}

内容的提问来源于stack exchange,提问作者Piotr Siupa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:31:03