[class.bit] # 11 Classes [[class]](./#class) ## 11.4 Class members [[class.mem]](class.mem#class.bit) ### 11.4.10 Bit-fields [class.bit] [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L2871) A [*member-declarator*](class.mem.general#nt:member-declarator "11.4.1 General [class.mem.general]") of the form [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]")opt [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt : [*constant-expression*](expr.const#nt:constant-expression "7.7 Constant expressions [expr.const]") [*brace-or-equal-initializer*](dcl.init.general#nt:brace-or-equal-initializer "9.5.1 General [dcl.init.general]")opt specifies a bit-field[.](#1.sentence-1) The optional [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]") appertains to the entity being declared[.](#1.sentence-2) A bit-field shall not be a static member[.](#1.sentence-3) A bit-field shall have integral or (possibly cv-qualified) enumeration type; the bit-field semantic property is not part of the type of the class member[.](#1.sentence-4) The [*constant-expression*](expr.const#nt:constant-expression "7.7 Constant expressions [expr.const]") shall be an integral constant expression with a value greater than or equal to zero and is called the [*width*](simd.general#def:width "29.10.1 General [simd.general]") of the bit-field[.](#1.sentence-5) If the width of a bit-field is larger than the width of the bit-field's type (or, in case of an enumeration type, of its underlying type), the extra bits are padding bits ([[basic.types.general]](basic.types.general#term.padding.bits "6.9.1 General"))[.](#1.sentence-6) Allocation of bit-fields within a class object isimplementation-defined[.](#1.sentence-7) Alignment of bit-fields is implementation-defined[.](#1.sentence-8) Bit-fields are packed into some addressable allocation unit[.](#1.sentence-9) [*Note [1](#note-1)*: Bit-fields straddle allocation units on some machines and not on others[.](#1.sentence-10) Bit-fields are assigned right-to-left on some machines, left-to-right on others[.](#1.sentence-11) — *end note*] [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L2905) A declaration for a bit-field that omits the [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") declares an [*unnamed bit-field*](#def:bit-field,unnamed "11.4.10 Bit-fields [class.bit]")[.](#2.sentence-1) Unnamed bit-fields are not members and cannot be initialized[.](#2.sentence-2) An unnamed bit-field shall not be declared with a cv-qualified type[.](#2.sentence-3) [*Note [2](#note-2)*: An unnamed bit-field is useful for padding to conform to externally-imposed layouts[.](#2.sentence-4) — *end note*] As a special case, an unnamed bit-field with a width of zero specifies alignment of the next bit-field at an allocation unit boundary[.](#2.sentence-5) Only when declaring an unnamed bit-field may the width be zero[.](#2.sentence-6) [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L2920) The address-of operator & shall not be applied to a bit-field, so there are no pointers to bit-fields[.](#3.sentence-1) A non-const reference shall not bind to a bit-field ([[dcl.init.ref]](dcl.init.ref "9.5.4 References"))[.](#3.sentence-2) [*Note [3](#note-3)*: If the initializer for a reference of type const T& is an lvalue that refers to a bit-field, the reference is bound to a temporary initialized to hold the value of the bit-field; the reference is not bound to the bit-field directly[.](#3.sentence-3) See [[dcl.init.ref]](dcl.init.ref "9.5.4 References")[.](#3.sentence-4) — *end note*] [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L2935) If a value of integral type (other than bool) is stored into a bit-field of width N and the value would be representable in a hypothetical signed or unsigned integer type with width N and the same signedness as the bit-field's type, the original value and the value of the bit-field compare equal[.](#4.sentence-1) If the value true or false is stored into a bit-field of type bool of any size (including a one bit bit-field), the original bool value and the value of the bit-field compare equal[.](#4.sentence-2) If a value of an enumeration type is stored into a bit-field of the same type and the width is large enough to hold all the values of that enumeration type ([[dcl.enum]](dcl.enum "9.8.1 Enumeration declarations")), the original value and the value of the bit-field compare equal[.](#4.sentence-3) [*Example [1](#example-1)*: enum BOOL { FALSE=0, TRUE=1 };struct A { BOOL b:1;}; A a;void f() { a.b = TRUE; if (a.b == TRUE) // yields true{ /* ... */ }} — *end example*]