### require

A customisation point that applies a concept-preserving property to an object.

    constexpr unspecified require = unspecified;

The name `require` denotes a customisation point object. The expression `asio::require(E, P0, Pn...)` for some subexpressions `E` and `P0`, and where `Pn...` represents `N` subexpressions (where `N` is 0 or more, and with types `T = decay_t<decltype(E)>` and `Prop0 = decay_t<decltype(P0)>`) is expression-equivalent to:

- If `is_applicable_property_v<T, Prop0> && Prop0::is_requirable` is not a well-formed constant expression with value `true`, `asio::require(E, P0, Pn...)` is ill-formed.
- Otherwise, `E` if `N == 0` and the expression `Prop0::template static_query_v<T> == Prop0::value()` is a well-formed constant expression with value `true`.
- Otherwise, `(E).require(P0)` if `N == 0` and the expression `(E).require(P0)` is a valid expression.
- Otherwise, `require(E, P0)` if `N == 0` and the expression `require(E, P0)` is a valid expression with overload resolution performed in a context that does not include the declaration of the `require` customization point object.
- Otherwise, `asio::require(asio::require(E, P0), Pn...)` if `N > 0` and the expression `asio::require(asio::require(E, P0), Pn...)` is a valid expression.
- Otherwise, `asio::require(E, P0, Pn...)` is ill-formed.

##### Requirements

Header: `asio/require.hpp`

Convenience header: `asio.hpp`