2015-07-05 4 views
-3

Недавно я столкнулся с каким-то очень странным синтаксисом:Colon после объявления участника класса?

struct Test { 
    size_t a : 2; 
    size_t b : 3; 
    size_t c : 4; 
}; 

Как ни странно, это компилируется с GCC 4.9.2 со всеми флагами предупреждения включено.

void test_test() { 
    Test test; 
    std::cout << test.a << " " << test.b << " " << test.c << std::endl; 
} 

Заявляя тест не дает никаких ошибок и выходов 0 0 0 (я считаю, 0 просто совпадением, так как структура является Plain Old Data, ни один из его членов не являются по умолчанию инициализируется 0), изменяя заявление на определение через Test test(); дает ошибку

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

Включение C++ 11 удаляет сообщения об ошибках, но значения по-прежнему остаются загадочно 0. Что этот синтаксис достичь?

+0

Это немного поле. – ikegami

+1

'Test test();' объявляет функцию без аргументов и возвращает 'Test', а не переменную типа' Test'. – WorldSEnder

+1

(который называется «самым неприятным анализом») – deviantfan

ответ

3

Этот синтаксис является битовым полем.

struct Test { 
    size_t a : 2; // Occupies two bits 
    size_t b : 3; // Occupies three bits 
    size_t c : 4; // Occupies four bits 
}; 
Смежные вопросы