### Protocol requirements

A type `X` meets the `Protocol` requirements if it satisfies the requirements of `Destructible` (C++Std [destructible]), `CopyConstructible` (C++Std [copyconstructible]), and `CopyAssignable` (C++Std [copyassignable]), as well as the additional requirements listed below.

No copy or move operation of the type `X` shall exit via an exception.

Table 23. Protocol requirements

expression | return type | assertion/note pre/post-conditions
--- | --- | ---
`X::endpoint` | type meeting endpoint requirements |

In the table below, `a` denotes a (possibly const) value of type `X`.

Table 24. Protocol requirements for extensible implementations

expression | return type | assertion/note pre/post-conditions
--- | --- | ---
`a.family()` | `int` | Returns a value suitable for passing as the domain argument to POSIX `socket()` (or equivalent).
`a.type()` | `int` | Returns a value suitable for passing as the type argument to POSIX `socket()` (or equivalent).
`a.protocol()` | `int` | Returns a value suitable for passing as the protocol argument to POSIX `socket()` (or equivalent).