为什么 static_cast 枚举 class 底层类型是 int8_t 以获得意外值?
Why static_cast enum class that underlying type is int8_t to get an unexpected value?
- 编译器: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
-----------
但是当我做了一个小小的修改,将枚举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
.
- 编译器: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
-----------
但是当我做了一个小小的修改,将枚举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
.