【问题标题】:Why static_cast enum class that underlying type is int8_t to get an unexpected value? [duplicate]为什么底层类型为 int8_t 的 static_cast 枚举类会得到意想不到的值? [复制]
【发布时间】:2020-06-27 09:47:57
【问题描述】:
  • 编译器:clang++
  • c++ 标准:c++20

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

#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
-----------

但是当我做了一个小修改,将枚举类的底层类型从 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;
}

结果:

-----------

-----------

这里发生了什么?

【问题讨论】:

    标签: c++ static-cast enum-class


    【解决方案1】:

    int8_t 映射到 char,默认情况下,这种类型被打印为其字符表示。值为 1 的字符是您看不到的控制字符。

    所以,cout &lt;&lt; (int8_t)65 将打印 A 而不是 65,因为单个字符 'A' 的值是 65。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-10
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      相关资源
      最近更新 更多