[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*]
