为什么 static_cast 枚举 class 底层类型是 int8_t 以获得意外值?

Why static_cast enum class that underlying type is int8_t to get an unexpected value?

我尝试运行代码,结果非常符合我的预期。

#include <iostream>

using namespace std;

int main()
{
    enum class Num : int
    {
        one = 1,
        two = 2,
        zero = 0
    };

    Num e = Num::one;
    auto a = static_cast<std::underlying_type_t<Num>>(e);

    cout << "-----------" << endl;
    cout << a << endl;
    cout << "-----------" << endl;
    return 0;
}

结果:

-----------
1
-----------

但是当我做了一个小小的修改,将枚举class的底层类型从int改为int8_t,结果出乎意料。

#include <iostream>

using namespace std;

int main()
{
    enum class Num : int8_t // from 'int' to 'int8_t'
    {
        one = 1,
        two = 2,
        zero = 0
    };

    Num e = Num::one;
    auto a = static_cast<std::underlying_type_t<Num>>(e);

    cout << "-----------" << endl;
    cout << a << endl;
    cout << "-----------" << endl;
    return 0;
}

结果:

-----------

-----------

这里发生了什么?

int8_t 映射到 char,此类型默认打印为其字符表示。值为1的字符是你看不到的控制字符。

因此,cout << (int8_t)65 将打印 A 而不是 65,因为单个字符 'A' 的值为 65。

您可以通过在打印前转换为 int 来避免这种情况:cout << (int)a,或者使用一元加号运算符:cout << +a.