Несколько типов , определенных в пунктах [language.support] через [thread] и Дополнением [depr] являются bitmask types. Каждый тип битовой маски может быть реализован как перечислимый тип, который перегружает определенные операторы, как целочисленный тип или как bitset.
Тип битовой маски bitmask можно записать:
// For exposition only. // int_type is an integral type capable of representing all values of the bitmask type. enum bitmask : int_type { \textit{V}0 = 1 << 0, \textit{V}1 = 1 << 1, \textit{V}2 = 1 << 2, \textit{V}3 = 1 << 3, ..... }; inline constexpr \textit{bitmask C}0(\textit{V}0); inline constexpr \textit{bitmask C}1(\textit{V}1); inline constexpr \textit{bitmask C}2(\textit{V}2); inline constexpr \textit{bitmask C}3(\textit{V}3); ..... constexpr bitmask operator&(bitmask X, bitmask Y) { return static_cast<bitmask>( static_cast<int_type>(X) & static_cast<int_type>(Y)); } constexpr bitmask operator|(bitmask X, bitmask Y) { return static_cast<bitmask>( static_cast<int_type>(X) | static_cast<int_type>(Y)); } constexpr bitmask operator^(bitmask X, bitmask Y){ return static_cast<bitmask>( static_cast<int_type>(X) ^ static_cast<int_type>(Y)); } constexpr bitmask operator~(bitmask X){ return static_cast<bitmask>(~static_cast<int_type>(X)); } bitmask& operator&=(bitmask& X, bitmask Y){ X = X & Y; return X; } bitmask& operator|=(bitmask& X, bitmask Y) { X = X | Y; return X; } bitmask& operator^=(bitmask& X, bitmask Y) { X = X ^ Y; return X; }
Здесь имена \textit{C}0, \textit{C}1и т.д. , представляют bitmask elements для этого конкретного типа Bitmask. Все такие элементы имеют различные ненулевые значения, такие что для любой пары \textit{C}i и \textit{C}j где i≠j, Ci & Ci отличен от нуля и Ci & Cj равен нулю. Кроме того, значение 0 используется для представления объекта empty bitmask, в котором не установлены элементы битовой маски.
Следующие термины применяются к объектам и значениям типов битовых масок:
Чтобы set получить значение Y в объекте X , нужно оценить выражение X |= Y.
Чтобы clear получить значение Y в объекте X , нужно оценить выражение X &= ~Y.
Значение Y is set в объекте, X если выражение не X & Y равно нулю.