diff --git a/execution.bs b/execution.bs
index a2b8c2e..316129d 100644
--- a/execution.bs
+++ b/execution.bs
@@ -5773,55 +5773,20 @@ template<class Domain, class Tag, sender Sender, class... Args>
completes synchronously in its start operation with a value completion
result equal to a value read from the receiver's associated environment.
-2. `read` is a customization point object of the unspecified class type:
+2. `read` is a customization point object. For some query object `q` of type `Q`,
+ the expression `read(q)` is expression-equivalent to
+ make-sender(read, q)
.
-
- template<class Tag> - struct read-sender; // exposition only - - struct read-t { // exposition only - template<class Tag> - constexpr read-sender<Tag> operator()(Tag) const noexcept { - return {}; - } - }; -- -3.
read-sender
is the exposition-only class template:
+3. The exposition-only class template impls-for
([exec.snd.general])
+ is specialized for `read` as follows:
- template<class Tag> - struct read-sender { // exposition only - using sender_concept = sender_t; - template<class R> - struct operation-state { // exposition only - R r_; // exposition only - - friend void tag_invoke(start_t, operation-state& s) noexcept { - TRY-SET-VALUE(std::move(s.r_), Tag{}(get_env(s.r_))); - } - }; - - template<receiver R> - friend operation-state<decay_t<R>> tag_invoke(connect_t, read-sender, R && r) { - return { std::forward<R>(r) }; - } - - template<class Env> - requires callable<Tag, Env> - friend auto tag_invoke(get_completion_signatures_t, read-sender, Env) - -> completion_signatures< - set_value_t(call-result-t<Tag, Env>), set_error_t(exception_ptr)>; // not defined - - template<class Env> - requires nothrow-callable<Tag, Env> - friend auto tag_invoke(get_completion_signatures_t, read-sender, Env) - -> completion_signatures<set_value_t(call-result-t<Tag, Env>)>; // not defined - - friend empty_env tag_invoke(get_env_t, const read-sender&) noexcept { - return {}; - } + template<> + struct impls-for<tag_t<read>> : default-impls { + static constexpr auto start = [](auto query, auto& rcvr) noexcept -> void { + TRY-SET-VALUE(std::move(rcvr), query(get_env(rcvr))); }; + };### Sender adaptors [exec.adapt] ### {#spec-execution.senders.adapt}