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}