|  | 
template<class S>
  concept scheduler =
    copy_constructible<remove_cvref_t<S>> &&
    equality_comparable<remove_cvref_t<S>> &&
    requires(E&& e) {
      execution::schedule((E&&)e);
    };
        None of a scheduler's copy constructor, destructor, equality comparison,
        or swap operation shall exit via an exception.
      
        None of these operations, nor a scheduler type's schedule function,
        or associated query functions shall introduce data races as a result of concurrent
        invocations of those functions from different threads.
      
        For any two (possibly const) values x1 and x2 of
        some scheduler type X, x1 == x2 shall return true
        only if asio::query(x1, p) == asio::query(x2, p) for every property
        p where both asio::query(x1, p) and asio::query(x2,
        p) are well-formed and result in a non-void type that is EqualityComparable
        (C++Std [equalitycomparable]). [Note: The above requirements
        imply that x1 == x2 returns true if x1
        and x2 can be interchanged with identical effects. A scheduler
        may conceptually contain additional properties which are not exposed by a
        named property type that can be observed via asio::query; in
        this case, it is up to the concrete scheduler implementation to decide if
        these properties affect equality. Returning false does not necessarily
        imply that the effects are not identical. —end note]
      
        A scheduler type's destructor shall not block pending completion of any receivers
        submitted to the sender objects returned from schedule. [Note:
        The ability to wait for completion of submitted function objects may be provided
        by the execution context that produced the scheduler. —end note]
      
        In addition to the above requirements, type S models scheduler
        only if it satisfies the requirements in the Table below.
      
In the Table below,
s denotes a (possibly const) scheduler object of type S,
          N denotes a type that models sender, and
          n denotes a sender object of type N
          Table 25. Scheduler requirements
| expression | return type | operation semantics | 
|---|---|---|
| 
                   | 
                   | 
                  Evaluates  | 
        execution::start(o), where o is the result of a
        call to execution::connect(N, r) for some receiver object r,
        is required to eagerly submit r for execution on an execution
        agent that s creates for it. Let rc be r
        or an object created by copy or move construction from r. The
        semantic constraints on the sender N returned from
        a scheduler s's schedule function are as follows:
      
rc's set_error function is called in response
            to a submission error, scheduling error, or other internal error, let
            E be an expression that refers to that error if set_error(rc,
            E) is well-formed; otherwise, let E be an exception_ptr
            that refers to that error. [Note: E could be the result
            of calling current_exception or make_exception_ptr.]
            The scheduler calls set_error(rc, E) on an unspecified weakly-parallel
            execution agent ([Note: An invocation of set_error on a
            receiver is required to be noexcept]), and
          rc's set_error function is called in response
            to an exception that propagates out of the invocation of set_value
            on rc, let E be make_exception_ptr(receiver_invocation_error{})
            invoked from within a catch clause that has caught the exception. The
            executor calls set_error(rc, E) on an unspecified weakly-parallel
            execution agent, and
          set_done(rc) is made on an unspecified weakly-parallel
            execution agent ([Note: An invocation of a receiver's set_done
            function is required to be noexcept]).
          
        [Note: The senders returned from a scheduler's schedule
        function have wide discretion when deciding which of the three receiver functions
        to call upon submission. —end note]