### Resolver service requirements

A resolver service must meet the requirements for an I/O object service, as well as the additional requirements listed below.

In the table below, `X` denotes a resolver service class for protocol `InternetProtocol`, `a` denotes a value of type `X`, `b` denotes a value of type `X::implementation_type`, `q` denotes a value of type `ip::basic_resolver_query<InternetProtocol>`, `e` denotes a value of type `ip::basic_endpoint<InternetProtocol>`, `ec` denotes a value of type `error_code`, and `h` denotes a value meeting `ResolveHandler` requirements.

Table 17. ResolverService requirements

expression | return type | assertion/note pre/post-condition
--- | --- | ---
`a.destroy(b);` |  | From IoObjectService requirements. Implicitly cancels asynchronous resolve operations, as if by calling `a.cancel(b, ec)`.
    a.cancel(b, ec);
| `error_code` | Causes any outstanding asynchronous resolve operations to complete as soon as possible. Handlers for cancelled operations shall be passed the error code `error::operation_aborted`.
    a.resolve(b, q, ec);
    ip::basic_resolver_iterator<
      InternetProtocol>
| On success, returns an iterator `i` such that `i != ip::basic_resolver_iterator<InternetProtocol>()`. Otherwise returns `ip::basic_resolver_iterator<InternetProtocol>()`.
    a.async_resolve(b, q, h);
|  | Initiates an asynchronous resolve operation that is performed via the `io_service` object `a.io_service()` and behaves according to asynchronous operation requirements. If the operation completes successfully, the `ResolveHandler` object `h` shall be invoked with an iterator object `i` such that the condition `i != ip::basic_resolver_iterator<InternetProtocol>()` holds. Otherwise it is invoked with `ip::basic_resolver_iterator<InternetProtocol>()`.
    a.resolve(b, e, ec);
    ip::basic_resolver_iterator<
      InternetProtocol>
| On success, returns an iterator `i` such that `i != ip::basic_resolver_iterator<InternetProtocol>()`. Otherwise returns `ip::basic_resolver_iterator<InternetProtocol>()`.
    a.async_resolve(b, e, h);
|  | Initiates an asynchronous resolve operation that is performed via the `io_service` object `a.io_service()` and behaves according to asynchronous operation requirements. If the operation completes successfully, the `ResolveHandler` object `h` shall be invoked with an iterator object `i` such that the condition `i != ip::basic_resolver_iterator<InternetProtocol>()` holds. Otherwise it is invoked with `ip::basic_resolver_iterator<InternetProtocol>()`.