| r[type.struct] |
| # Struct types |
| |
| r[type.struct.intro] |
| A `struct` *type* is a heterogeneous product of other types, called the |
| *fields* of the type.[^structtype] |
| |
| r[type.struct.constructor] |
| New instances of a `struct` can be constructed with a [struct expression]. |
| |
| r[type.struct.layout] |
| The memory layout of a `struct` is undefined by default to allow for compiler |
| optimizations like field reordering, but it can be fixed with the |
| [`repr` attribute]. In either case, fields may be given in any order in a |
| corresponding struct *expression*; the resulting `struct` value will always |
| have the same memory layout. |
| |
| r[type.struct.field-visibility] |
| The fields of a `struct` may be qualified by [visibility modifiers], to allow |
| access to data in a struct outside a module. |
| |
| r[type.struct.tuple] |
| A _tuple struct_ type is just like a struct type, except that the fields are |
| anonymous. |
| |
| r[type.struct.unit] |
| A _unit-like struct_ type is like a struct type, except that it has no fields. |
| The one value constructed by the associated [struct expression] is the only |
| value that inhabits such a type. |
| |
| [^structtype]: `struct` types are analogous to `struct` types in C, the |
| *record* types of the ML family, or the *struct* types of the Lisp family. |
| |
| [`repr` attribute]: ../type-layout.md#representations |
| [struct expression]: ../expressions/struct-expr.md |
| [visibility modifiers]: ../visibility-and-privacy.md |