### Protocol requirements

A protocol must meet the requirements of `CopyConstructible` types (C++ Std, 20.1.3), and the requirements of `Assignable` types (C++ Std, 23.1).

In the table below, `X` denotes a protocol class, and `a` denotes a value of `X`.

Table 16. Protocol requirements

expression | return type | assertion/note pre/post-conditions
--- | --- | ---
`X::endpoint` | type meeting endpoint requirements |
`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).