类成员声明后的冒号?

Lem*_*nPi 2 c++ syntax struct

我最近遇到一些很奇怪的语法:

struct Test {
    size_t a : 2;
    size_t b : 3;
    size_t c : 4;
};
Run Code Online (Sandbox Code Playgroud)

奇怪的是,它使用 GCC 4.9.2 进行编译,并且所有警告标志都打开。

void test_test() {
    Test test;
    std::cout << test.a << " " << test.b << " " << test.c << std::endl;
} 
Run Code Online (Sandbox Code Playgroud)

虽然声明 test 没有给出错误和输出0 0 0(我相信 0 只是巧合;由于该结构是普通旧数据,所以它的所有成员都没有默认初始化为 0),将声明更改为定义 via 会Test test();给出错误

tester.cpp:14:20: error: request for member 'a' in 'test', which is of non-class
 type 'Test()'
Run Code Online (Sandbox Code Playgroud)

启用 C++11 会删除错误消息,但值仍然保持神秘的 0。此语法实现了什么

Wor*_*der 8

该语法是位域。

struct Test {
    size_t a : 2; // Occupies two bits
    size_t b : 3; // Occupies three bits
    size_t c : 4; // Occupies four bits
};
Run Code Online (Sandbox Code Playgroud)