### I/O object service requirements

An I/O object service must meet the requirements for a service, as well as the requirements listed below.

In the table below, `X` denotes an I/O object service class, `a` and `ao` denote values of type `X`, `b` and `c` denote values of type `X::implementation_type`, and `u` denotes an identifier.

Table 21. IoObjectService requirements

expression | return type | assertion/note pre/post-condition
--- | --- | ---
`X::implementation_type` |  |
`X::implementation_type u;` |  | note: `X::implementation_type` has a public default constructor and destructor.
    a.construct(b);
    a.destroy(b);
|  | note: `destroy()` will only be called on a value that has previously been initialised with `construct()` or `move_construct()`.
    a.move_construct(b, c);
|  | note: only required for I/O objects that support movability.
    a.move_assign(b, ao, c);
|  | note: only required for I/O objects that support movability.