为什么 C++ 位域要求我指定类型?

D.R*_*.R. 6 c++ c++20

为什么我必须为位域指定类型?

struct MyBitField
{
    unsigned int i : 4;
}

struct MyBitField2
{
    unsigned char i : 4;
}
Run Code Online (Sandbox Code Playgroud)

这两者有什么区别?为什么我需要指定一个类型?

Ast*_*ngs 3

位域是普通成员周围的“覆盖”,每个成员都有一个类型。回想一下,C++ 中的整数类型很大程度上继承自 C 中的类型,这些类型旨在巧妙地映射到目标体系结构上存在的任何原语。这是一个很方便的功能。位域位于该逻辑之上;他们不会取代它。

与此相关的一些事实:

类型从根本上支撑了对象在 C++ 中的工作方式以及如何编码和解释这些对象的值。

位域功能可以有不同的设计吗?也许,作为语言中不需要特定底层类型的单独的一流事物?

也许吧,但是您需要新的规则来定义位域整数语义(有符号和无符号)以及每个赋值组合的转换规则。重点是什么?我们已经有了一个可以使用的类型系统。

当然,在您的情况下,显示的每个对象的语义是相同的。但还存在其他位域。您可能会问,为什么unsigned int和 都unsigned long存在于一个系统上,它们各自的范围相同:我们不会围绕非常具体的情况设计语言。

如果您想要的只是非类型化位的集合,那么这std::bitset<4>就是您正在寻找的。