diff --git a/include/sdbusplus/async/stdexec/__detail/__basic_sender.hpp b/include/sdbusplus/async/stdexec/__detail/__basic_sender.hpp
index 5f02635..843c5e4 100644
--- a/include/sdbusplus/async/stdexec/__detail/__basic_sender.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__basic_sender.hpp
@@ -53,7 +53,7 @@
     STDEXEC_ATTRIBUTE((always_inline))
     _Data&& operator()(__ignore, _Data&& __data, _Rest&&...) const noexcept
     {
-        return (_Data&&)__data;
+        return static_cast<_Data&&>(__data);
     }
 };
 
@@ -75,6 +75,9 @@
     using __tag = _Tag;
     using __data = _Data;
     using __children = __types<_Child...>;
+
+    template <class _Fn>
+    using __f = __minvoke<_Fn, _Tag, _Data, _Child...>;
 };
 
 template <class _Fn>
@@ -174,7 +177,7 @@
 //   alignas(_Parent) char __buf[sizeof(_Parent)];
 //   _Parent* __parent = (_Parent*) &__buf;
 //   const std::ptrdiff_t __offset = (char*) &(__parent->*__mbr_ptr) - __buf;
-//   return (_Parent*) ((char*) __child - __offset);
+//   return (_Parent*) (static_cast<char*>(__child) - __offset);
 // }
 
 inline constexpr auto __get_attrs = //
@@ -188,7 +191,6 @@
     {
         return empty_env();
     }
-    STDEXEC_UNREACHABLE();
 };
 
 inline constexpr auto __get_env = //
@@ -197,7 +199,7 @@
 
 inline constexpr auto __get_state = //
     []<class _Sender>(_Sender&& __sndr, __ignore) noexcept -> decltype(auto) {
-    return STDEXEC_CALL_EXPLICIT_THIS_MEMFN((_Sender&&)__sndr,
+    return STDEXEC_CALL_EXPLICIT_THIS_MEMFN(static_cast<_Sender&&>(__sndr),
                                             apply)(__get_data());
 };
 
@@ -206,8 +208,8 @@
         _Sender&& __sndr, _Receiver __rcvr) -> __op_state<_Sender, _Receiver>
     requires __connectable<_Sender, _Receiver>
 {
-    return __op_state<_Sender, _Receiver>{(_Sender&&)__sndr,
-                                          (_Receiver&&)__rcvr};
+    return __op_state<_Sender, _Receiver>{static_cast<_Sender&&>(__sndr),
+                                          static_cast<_Receiver&&>(__rcvr)};
 };
 
 inline constexpr auto __start = //
@@ -223,10 +225,10 @@
         _Args&&... __args) noexcept {
     static_assert(__v<_Index> == 0,
                   "I don't know how to complete this operation.");
-    _SetTag()(std::move(__rcvr), (_Args&&)__args...);
+    _SetTag()(std::move(__rcvr), static_cast<_Args&&>(__args)...);
 };
 
-inline constexpr auto __get_completion_signagures = //
+inline constexpr auto __get_completion_signatures = //
     [](__ignore, __ignore) noexcept { return void(); };
 
 template <class _ReceiverId, class _Sexpr, class _Idx>
@@ -252,15 +254,16 @@
         //   using __parent_op_t = __op_state<_Sexpr, _Receiver>;
         //   std::ptrdiff_t __offset = __parent_op_t::template
         //   __get_child_op_offset<__v<_Idx>>();
-        //   __parent_op_t* __parent = (__parent_op_t*) ((char*) __child -
-        //   __offset); return __t{__parent};
+        //   __parent_op_t* __parent = (__parent_op_t*)
+        //   (static_cast<char*>(__child) - __offset); return __t{__parent};
         // }
 
         template <__completion_tag _Tag, class... _Args>
         STDEXEC_ATTRIBUTE((always_inline))
         friend void tag_invoke(_Tag, __t&& __self, _Args&&... __args) noexcept
         {
-            __self.__op_->__complete(_Idx(), _Tag(), (_Args&&)__args...);
+            __self.__op_->__complete(_Idx(), _Tag(),
+                                     static_cast<_Args&&>(__args)...);
         }
 
         template <same_as<get_env_t> _Tag, class _SexprTag = __tag_t>
@@ -289,11 +292,12 @@
     STDEXEC_IMMOVABLE_NO_UNIQUE_ADDRESS __state_t __state_;
 
     __op_base(_Sexpr&& __sndr, _Receiver&& __rcvr) :
-        __rcvr_((_Receiver&&)__rcvr),
-        __state_(__sexpr_impl<__tag_t>::get_state((_Sexpr&&)__sndr, __rcvr_))
+        __rcvr_(static_cast<_Receiver&&>(__rcvr)),
+        __state_(__sexpr_impl<__tag_t>::get_state(static_cast<_Sexpr&&>(__sndr),
+                                                  __rcvr_))
     {}
 
-    _Receiver& __rcvr() & noexcept
+    auto __rcvr() & noexcept -> _Receiver&
     {
         return __rcvr_;
     }
@@ -309,8 +313,9 @@
 //   STDEXEC_IMMOVABLE_NO_UNIQUE_ADDRESS __state_t __state_;
 
 //   __op_base(_Sexpr&& __sndr, _Receiver&& __rcvr)
-//     : __state_(__sexpr_impl<__tag_t>::get_state((_Sexpr&&) __sndr, __rcvr)) {
-//     STDEXEC_ASSERT(this->__rcvr().__op_ == __rcvr.__op_);
+//     :
+//     __state_(__sexpr_impl<__tag_t>::get_state(static_cast<_Sexpr&&>(__sndr),
+//     __rcvr)) { STDEXEC_ASSERT(this->__rcvr().__op_ == __rcvr.__op_);
 //   }
 
 //   _Receiver __rcvr() const noexcept {
@@ -329,12 +334,13 @@
 {
     using __op_base_t = __op_base<_Sexpr, _Receiver>;
 
-    decltype(auto) __receiver() noexcept
+    auto __receiver() noexcept -> decltype(auto)
     {
         using __derived_t = decltype(__op_base_t::__state_);
-        __derived_t* __derived = static_cast<__derived_t*>(this);
+        auto* __derived = static_cast<__derived_t*>(this);
         constexpr std::size_t __offset = offsetof(__op_base_t, __state_);
-        __op_base_t* __base = (__op_base_t*)((char*)__derived - __offset);
+        auto* __base = reinterpret_cast<__op_base_t*>(
+            reinterpret_cast<char*>(__derived) - __offset);
         return __base->__rcvr();
     }
 };
@@ -363,8 +369,8 @@
             -> __tup::__tuple<__indices<_Is...>,
                               connect_result_t<_Child, __receiver_t<_Is>>...>
         {
-            return __tuple{
-                connect((_Child&&)__child, __receiver_t<_Is>{__op_})...};
+            return __tuple{connect(static_cast<_Child&&>(__child),
+                                   __receiver_t<_Is>{__op_})...};
         }
     };
 
@@ -374,7 +380,8 @@
                            _Child...>
     {
         return __impl{__op_}(__indices_for<_Child...>(), _Tag(),
-                             (_Data&&)__data, (_Child&&)__child...);
+                             static_cast<_Data&&>(__data),
+                             static_cast<_Child&&>(__child)...);
     }
 };
 STDEXEC_PRAGMA_POP()
@@ -396,12 +403,14 @@
     // static std::ptrdiff_t __get_child_op_offset() noexcept {
     //   __op_state* __self = (__op_state*) &__self;
     //   return (std::ptrdiff_t)((char*)
-    //   &__tup::__get<_Idx>(__self->__inner_ops_) - (char*) __self);
+    //   &__tup::__get<_Idx>(__self->__inner_ops_) -
+    //   static_cast<char*>(__self));
     // }
 
     __op_state(_Sexpr&& __sexpr, _Receiver __rcvr) :
-        __op_state::__op_base{(_Sexpr&&)__sexpr, (_Receiver&&)__rcvr},
-        __inner_ops_(__sexpr_apply((_Sexpr&&)__sexpr,
+        __op_state::__op_base{static_cast<_Sexpr&&>(__sexpr),
+                              static_cast<_Receiver&&>(__rcvr)},
+        __inner_ops_(__sexpr_apply(static_cast<_Sexpr&&>(__sexpr),
                                    __connect_fn<_Sexpr, _Receiver>{this}))
     {}
 
@@ -425,11 +434,12 @@
         using __tag_t = typename __op_state::__tag_t;
         auto&& __rcvr = this->__rcvr();
         __sexpr_impl<__tag_t>::complete(_Index(), this->__state_, __rcvr,
-                                        _Tag2(), (_Args&&)__args...);
+                                        _Tag2(),
+                                        static_cast<_Args&&>(__args)...);
     }
 
     template <class _Index>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     auto __get_env(_Index) noexcept
         -> __env_type_t<__tag_t, _Index, _Sexpr, _Receiver>
     {
@@ -445,9 +455,55 @@
             auto&&, _Rest&&... __rest) noexcept(__nothrow_callable<const _Fn&,
                                                                    _Rest...>)
             -> __call_result_t<const _Fn&, _Rest...> {
-        return __fn((_Rest&&)__rest...);
+        return __fn(static_cast<_Rest&&>(__rest)...);
     };
 };
+
+template <class _Tag, class... _Captures>
+STDEXEC_ATTRIBUTE((host, device, always_inline))
+constexpr auto __captures(_Tag, _Captures&&... __captures2)
+{
+    return
+        [... __captures3 = static_cast<_Captures&&>(
+             __captures2)]<class _Cvref, class _Fun>(_Cvref,
+                                                     _Fun&& __fun) mutable   //
+        noexcept(
+            __nothrow_callable<_Fun, _Tag, __minvoke<_Cvref, _Captures>...>) //
+        -> __call_result_t<_Fun, _Tag, __minvoke<_Cvref, _Captures>...>
+            requires __callable<_Fun, _Tag, __minvoke<_Cvref, _Captures>...>
+    {
+        // The use of decltype(__captures3) here instead of _Captures is a
+        // workaround for a codegen bug in nvc++.
+        return static_cast<_Fun&&>(__fun)(
+            _Tag(), const_cast<__minvoke<_Cvref, decltype(__captures3)>&&>(
+                        __captures3)...);
+    };
+}
+
+template <class _Sender>
+concept __non_dependent_sender = //
+    requires { typename _Sender::completion_signatures; } ||
+    requires { requires _Sender::__is_non_dependent(); };
+
+template <class _Tag, class... _Child>
+concept __is_non_dependent_sexpr = //
+    !requires { typename __sexpr_impl<_Tag>::is_dependent; } &&
+    (__non_dependent_sender<_Child> && ...);
+
+template <class _Tag, class _Data, class... _Child>
+using __is_non_dependent_t = __mbool<__is_non_dependent_sexpr<_Tag, _Child...>>;
+
+template <class _Tag, class _Data, class... _Child>
+using __captures_t = decltype(__detail::__captures(_Tag(), __declval<_Data>(),
+                                                   __declval<_Child>()...));
+
+template <class, class, class... _Child>
+using __tuple_size_t = char[sizeof...(_Child) + 2];
+
+template <std::size_t _Idx, class _Descriptor>
+concept __in_range =
+    (_Idx < sizeof(__minvoke<_Descriptor, __q<__tuple_size_t>>));
+
 } // namespace __detail
 
 struct __sexpr_defaults
@@ -458,11 +514,11 @@
     static constexpr auto connect = __detail::__connect;
     static constexpr auto start = __detail::__start;
     static constexpr auto complete = __detail::__complete;
-    static constexpr auto get_completion_signagures =
-        __detail::__get_completion_signagures;
+    static constexpr auto get_completion_signatures =
+        __detail::__get_completion_signatures;
 };
 
-template <class Tag>
+template <class _Tag>
 struct __sexpr_impl : __sexpr_defaults
 {};
 
@@ -473,42 +529,44 @@
                                    __mtypeof<__sexpr_impl<_Tag>::get_attrs>>;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////
-// __sexpr
+// __basic_sender
 template <class...>
-struct __sexpr
+struct __basic_sender
 {
-    using __id = __sexpr;
-    using __t = __sexpr;
+    using __id = __basic_sender;
+    using __t = __basic_sender;
 };
 
-template <class _ImplFn>
-struct __sexpr<_ImplFn>
+template <auto _DescriptorFn, class = __anon>
+struct __sexpr
 {
     using sender_concept = sender_t;
-    using __t = __sexpr;
+
     using __id = __sexpr;
-    using __desc_t = __call_result_t<_ImplFn, __cp, __detail::__get_desc>;
+    using __t = __sexpr;
+    using __desc_t = decltype(_DescriptorFn());
     using __tag_t = typename __desc_t::__tag;
-    using __data_t = typename __desc_t::__data;
-    using __children_t = typename __desc_t::__children;
-    using __arity_t = __mapply<__msize, __children_t>;
+    using __captures_t = __minvoke<__desc_t, __q<__detail::__captures_t>>;
+
+    static constexpr auto __is_non_dependent() noexcept -> bool
+    {
+        return __v<__minvoke<__desc_t, __q<__detail::__is_non_dependent_t>>>;
+    }
+
+    mutable __captures_t __impl_;
+
+    template <class _Tag, class _Data, class... _Child>
+    STDEXEC_ATTRIBUTE((host, device, always_inline))
+    explicit __sexpr(_Tag, _Data&& __data, _Child&&... __child) :
+        __impl_(__detail::__captures(_Tag(), static_cast<_Data&&>(__data),
+                                     static_cast<_Child&&>(__child)...))
+    {}
 
     template <class _Tag>
     using __impl = __sexpr_impl<__meval<__msecond, _Tag, __tag_t>>;
 
-    STDEXEC_ATTRIBUTE((always_inline)) //
-    static __tag_t __tag() noexcept
-    {
-        return {};
-    }
-
-    mutable _ImplFn __impl_;
-
-    STDEXEC_ATTRIBUTE((host, device, always_inline))
-    explicit __sexpr(_ImplFn __impl) : __impl_((_ImplFn&&)__impl) {}
-
     template <same_as<get_env_t> _Tag, same_as<__sexpr> _Self>
-    STDEXEC_ATTRIBUTE((always_inline))                                   //
+    STDEXEC_ATTRIBUTE((always_inline))
     friend auto tag_invoke(_Tag, const _Self& __self) noexcept           //
         -> __msecond<
             __if_c<same_as<_Tag, get_env_t> && same_as<_Self, __sexpr>>, //
@@ -520,7 +578,7 @@
 
     template <same_as<get_completion_signatures_t> _Tag,
               __decays_to<__sexpr> _Self, class _Env>
-    STDEXEC_ATTRIBUTE((always_inline))                                  //
+    STDEXEC_ATTRIBUTE((always_inline))
     friend auto tag_invoke(_Tag, _Self&& __self, _Env&& __env) noexcept //
         -> __msecond<
             __if_c<same_as<_Tag, get_completion_signatures_t> &&
@@ -533,34 +591,37 @@
     // BUGBUG fix receiver constraint here:
     template <same_as<connect_t> _Tag, __decays_to<__sexpr> _Self,
               /*receiver*/ class _Receiver>
-    STDEXEC_ATTRIBUTE((always_inline))                                 //
-    friend auto tag_invoke(_Tag, _Self&& __self, _Receiver&& __rcvr)   //
-        noexcept(noexcept(__impl<_Tag>::connect((_Self&&)__self,
-                                                (_Receiver&&)__rcvr))) //
+    STDEXEC_ATTRIBUTE((always_inline))
+    friend auto tag_invoke(_Tag, _Self&& __self, _Receiver&& __rcvr)          //
+        noexcept(noexcept(__impl<_Tag>::connect(
+            static_cast<_Self&&>(__self), static_cast<_Receiver&&>(__rcvr)))) //
         -> __msecond<
             __if_c<same_as<_Tag, connect_t> && __decays_to<_Self, __sexpr>>,
             __result_of<__impl<_Tag>::connect, _Self, _Receiver>>
     {
-        return __impl<_Tag>::connect((_Self&&)__self, (_Receiver&&)__rcvr);
+        return __impl<_Tag>::connect(static_cast<_Self&&>(__self),
+                                     static_cast<_Receiver&&>(__rcvr));
     }
 
     template <class _Sender, class _ApplyFn>
-    STDEXEC_ATTRIBUTE((always_inline))                                   //
-    STDEXEC_DEFINE_EXPLICIT_THIS_MEMFN(auto apply)(this _Sender&& __sndr,
-                                                   _ApplyFn&& __fun)     //
-        noexcept(__nothrow_callable<__detail::__impl_of<_Sender>,
-                                    __copy_cvref_fn<_Sender>, _ApplyFn>) //
+    STDEXEC_ATTRIBUTE((always_inline))
+    STDEXEC_DEFINE_EXPLICIT_THIS_MEMFN(auto apply)(
+        this _Sender&& __sndr,
+        _ApplyFn&&
+            __fun) noexcept(__nothrow_callable<__detail::__impl_of<_Sender>,
+                                               __copy_cvref_fn<_Sender>,
+                                               _ApplyFn>) //
         -> __call_result_t<__detail::__impl_of<_Sender>,
                            __copy_cvref_fn<_Sender>, _ApplyFn>
-    {                                                                //
-        return ((_Sender&&)__sndr)
-            .__impl_(__copy_cvref_fn<_Sender>(), (_ApplyFn&&)__fun); //
+    {                                                                    //
+        return static_cast<_Sender&&>(__sndr).__impl_(
+            __copy_cvref_fn<_Sender>(), static_cast<_ApplyFn&&>(__fun)); //
     }
 
     template <std::size_t _Idx, __decays_to_derived_from<__sexpr> _Self>
     STDEXEC_ATTRIBUTE((always_inline))
     friend decltype(auto) get(_Self&& __self) noexcept
-        requires(_Idx < (__v<__arity_t> + 2))
+        requires __detail::__in_range<_Idx, __desc_t>
     {
         if constexpr (_Idx == 0)
         {
@@ -571,13 +632,36 @@
             return __self.__impl_(__copy_cvref_fn<_Self>(),
                                   __nth_pack_element<_Idx>);
         }
-        STDEXEC_UNREACHABLE();
     }
 };
 
-template <class _ImplFn>
+namespace
+{
+template <class _Descriptor, auto _DescriptorFn = [] { return _Descriptor(); }>
+inline constexpr auto __descriptor_fn_v = _DescriptorFn;
+
+template <class _Tag, class _Data, class... _Child>
+inline constexpr auto __descriptor_fn()
+{
+    return __descriptor_fn_v<__detail::__desc<_Tag, _Data, _Child...>>;
+}
+} // namespace
+
+#if STDEXEC_NVHPC()
+#define STDEXEC_SEXPR_DESCRIPTOR(_Tag, _Data, _Child)                          \
+    stdexec::__descriptor_fn<_Tag, _Data, _Child>()
+#else
+#define STDEXEC_SEXPR_DESCRIPTOR(_Tag, _Data, _Child)                          \
+    stdexec::__descriptor_fn_v<stdexec::__detail::__desc<_Tag, _Data, _Child>>
+#endif
+
+template <class _Tag, class _Data, class... _Child>
 STDEXEC_ATTRIBUTE((host, device))
-__sexpr(_ImplFn) -> __sexpr<_ImplFn>;
+__sexpr(_Tag, _Data, _Child...)
+    -> __sexpr<STDEXEC_SEXPR_DESCRIPTOR(_Tag, _Data, _Child...)>;
+
+template <class _Tag, class _Data, class... _Child>
+using __sexpr_t = __sexpr<STDEXEC_SEXPR_DESCRIPTOR(_Tag, _Data, _Child...)>;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////
 // __make_sexpr
@@ -587,129 +671,35 @@
 struct __make_sexpr_t
 {
     template <class _Data = __, class... _Child>
-    constexpr auto operator()(_Data __data = {}, _Child... __child) const;
-};
-
-#if STDEXEC_NVHPC() || (STDEXEC_GCC() && __GNUC__ < 13)
-// The NVIDIA HPC compiler and gcc prior to v13 struggle with capture
-// initializers for a parameter pack. As a workaround, we use a wrapper that
-// performs moves when non-const lvalues are copied. That constructor is
-// only used when capturing the variables, never when the resulting lambda
-// is copied or moved.
-
-// Move-by-copy
-template <class _Ty>
-struct __mbc
-{
-    template <class _Cvref>
-    using __f = __minvoke<_Cvref, _Ty>;
-
-    _Ty __value;
-
-    STDEXEC_ATTRIBUTE((always_inline))
-    explicit __mbc(_Ty& __v) noexcept(
-        std::is_nothrow_move_constructible_v<_Ty>) :
-        __value((_Ty&&)__v)
-    {}
-
-    // This is a template so as to not be considered a copy/move constructor.
-    // Therefore, it doesn't suppress the generation of the default copy/move
-    // constructors.
-    STDEXEC_ATTRIBUTE((always_inline))
-    __mbc(same_as<__mbc> auto& __that) noexcept(
-        std::is_nothrow_move_constructible_v<_Ty>) :
-        __value(static_cast<_Ty&&>(__that.__value))
-    {}
-};
-
-// Rather strange definition of the lambda return type below is to reap the
-// benefits of SFINAE without nvc++ encoding the whole return type into the
-// symbol name.
-template <class _Ty>
-extern _Ty (*__f)();
-
-// Anonymous namespace here is to avoid symbol name collisions with the
-// lambda functions returned by __make_tuple.
-namespace
-{
-constexpr auto __make_tuple = //
-    []<class _Tag, class... _Captures>(_Tag, _Captures&&... __captures) {
-    return
-        [=]<class _Cvref, class _Fun>(_Cvref __cvref, _Fun&& __fun) mutable  //
-        noexcept(
-            __nothrow_callable<_Fun, _Tag, __minvoke<_Captures, _Cvref>...>) //
-        -> decltype(__f<__call_result_t<_Fun, _Tag,
-                                        __minvoke<_Captures, _Cvref>...>>())
-            requires __callable<_Fun, _Tag, __minvoke<_Captures, _Cvref>...>
+    constexpr auto operator()(_Data __data = {}, _Child... __child) const
     {
-        return ((_Fun&&)__fun)(
-            _Tag(),
-            const_cast<__minvoke<_Captures, _Cvref>&&>(__captures.__value)...);
-    };
+        return __sexpr_t<_Tag, _Data, _Child...>{
+            _Tag(), static_cast<_Data&&>(__data),
+            static_cast<_Child&&>(__child)...};
+    }
 };
-} // anonymous namespace
-
-template <class _Tag>
-template <class _Data, class... _Child>
-constexpr auto __make_sexpr_t<_Tag>::operator()(_Data __data,
-                                                _Child... __child) const
-{
-    return __sexpr{__make_tuple(_Tag(), __detail::__mbc(__data),
-                                __detail::__mbc(__child)...)};
-}
-#else
-// Anonymous namespace here is to avoid symbol name collisions with the
-// lambda functions returned by __make_tuple.
-namespace
-{
-constexpr auto __make_tuple = //
-    []<class _Tag, class... _Captures>(_Tag, _Captures&&... __captures) {
-    return
-        [... __captures = (_Captures&&)__captures]<class _Cvref, class _Fun>(
-            _Cvref, _Fun&& __fun) mutable                                    //
-        noexcept(
-            __nothrow_callable<_Fun, _Tag, __minvoke<_Cvref, _Captures>...>) //
-        -> __call_result_t<_Fun, _Tag, __minvoke<_Cvref, _Captures>...>
-            requires __callable<_Fun, _Tag, __minvoke<_Cvref, _Captures>...>
-    {
-        return ((_Fun&&)__fun)(
-            _Tag(), const_cast<__minvoke<_Cvref, _Captures>&&>(__captures)...);
-    };
-};
-} // anonymous namespace
-
-template <class _Tag>
-template <class _Data, class... _Child>
-constexpr auto __make_sexpr_t<_Tag>::operator()(_Data __data,
-                                                _Child... __child) const
-{
-    return __sexpr{__make_tuple(_Tag(), (_Data&&)__data, (_Child&&)__child...)};
-};
-#endif
-
-template <class _Tag>
-inline constexpr __make_sexpr_t<_Tag> __make_sexpr{};
 } // namespace __detail
 
-using __detail::__make_sexpr;
-
-template <class _Tag, class _Data, class... _Child>
-using __sexpr_t = __result_of<__make_sexpr<_Tag>, _Data, _Child...>;
+template <class _Tag>
+inline constexpr __detail::__make_sexpr_t<_Tag> __make_sexpr{};
 
 namespace __detail
 {
 struct __sexpr_apply_t
 {
     template <class _Sender, class _ApplyFn>
-    STDEXEC_ATTRIBUTE((always_inline))                        //
-    auto operator()(_Sender&& __sndr, _ApplyFn&& __fun) const //
+    STDEXEC_ATTRIBUTE((always_inline))
+    auto operator()(_Sender&& __sndr, _ApplyFn&& __fun) const
         noexcept(noexcept(STDEXEC_CALL_EXPLICIT_THIS_MEMFN(
-            ((_Sender&&)__sndr), apply)((_ApplyFn&&)__fun)))  //
-        -> decltype(STDEXEC_CALL_EXPLICIT_THIS_MEMFN(((_Sender&&)__sndr),
-                                                     apply)((_ApplyFn&&)__fun))
+            (static_cast<_Sender&&>(__sndr)),
+            apply)(static_cast<_ApplyFn&&>(__fun)))) //
+        -> decltype(STDEXEC_CALL_EXPLICIT_THIS_MEMFN(
+            (static_cast<_Sender&&>(__sndr)),
+            apply)(static_cast<_ApplyFn&&>(__fun)))
     {
-        return STDEXEC_CALL_EXPLICIT_THIS_MEMFN(((_Sender&&)__sndr),
-                                                apply)((_ApplyFn&&)__fun); //
+        return STDEXEC_CALL_EXPLICIT_THIS_MEMFN(
+            (static_cast<_Sender&&>(__sndr)),
+            apply)(static_cast<_ApplyFn&&>(__fun)); //
     }
 };
 } // namespace __detail
@@ -735,13 +725,11 @@
 {
 struct __basic_sender_name
 {
-    template <class _Sender>
-    using __f = //
-        __call_result_t<__sexpr_apply_result_t<_Sender, __basic_sender_name>>;
-
     template <class _Tag, class _Data, class... _Child>
-    auto operator()(_Tag, _Data&&, _Child&&...) const //
-        -> __sexpr<_Tag, _Data, __name_of<_Child>...> (*)();
+    using __result = __basic_sender<_Tag, _Data, __name_of<_Child>...>;
+
+    template <class _Sender>
+    using __f = __minvoke<typename __decay_t<_Sender>::__desc_t, __q<__result>>;
 };
 
 struct __id_name
@@ -759,8 +747,8 @@
 template <class _Sender>
 extern __mcompose<__cpclr, __name_of_fn<_Sender>> __name_of_v<const _Sender&>;
 
-template <class _Impl>
-extern __basic_sender_name __name_of_v<__sexpr<_Impl>>;
+template <auto _Descriptor>
+extern __basic_sender_name __name_of_v<__sexpr<_Descriptor>>;
 
 template <__has_id _Sender>
     requires(!same_as<__id<_Sender>, _Sender>)
@@ -770,16 +758,20 @@
 
 namespace std
 {
-template <class _Impl>
-struct tuple_size<stdexec::__sexpr<_Impl>> :
-    integral_constant<
-        size_t, stdexec::__v<typename stdexec::__sexpr<_Impl>::__arity_t> + 2>
+template <auto _Descriptor>
+struct tuple_size<stdexec::__sexpr<_Descriptor>> :
+    integral_constant<size_t,
+                      stdexec::__v<stdexec::__minvoke<
+                          stdexec::__result_of<_Descriptor>, stdexec::__msize>>>
 {};
 
-template <size_t _Idx, class _Impl>
-struct tuple_element<_Idx, stdexec::__sexpr<_Impl>>
+template <size_t _Idx, auto _Descriptor>
+struct tuple_element<_Idx, stdexec::__sexpr<_Descriptor>>
 {
-    using type = stdexec::__remove_rvalue_reference_t<stdexec::__call_result_t<
-        _Impl, stdexec::__cp, stdexec::__nth_pack_element_t<_Idx>>>;
+    using type =                              //
+        stdexec::__remove_rvalue_reference_t< //
+            stdexec::__call_result_t<         //
+                stdexec::__detail::__impl_of<stdexec::__sexpr<_Descriptor>>,
+                stdexec::__cp, stdexec::__nth_pack_element_t<_Idx>>>;
 };
 } // namespace std
diff --git a/include/sdbusplus/async/stdexec/__detail/__concepts.hpp b/include/sdbusplus/async/stdexec/__detail/__concepts.hpp
index dd6d029..a3187a7 100644
--- a/include/sdbusplus/async/stdexec/__detail/__concepts.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__concepts.hpp
@@ -23,16 +23,16 @@
 
 //////////////////////////////////////////////////////////////////////////////////////////////////
 template <class _Fun, class... _As>
-concept __callable =                        //
-    requires(_Fun&& __fun, _As&&... __as) { //
-        ((_Fun&&)__fun)((_As&&)__as...);    //
+concept __callable =                                             //
+    requires(_Fun&& __fun, _As&&... __as) {                      //
+        static_cast<_Fun&&>(__fun)(static_cast<_As&&>(__as)...); //
     };
 template <class _Fun, class... _As>
 concept __nothrow_callable =    //
     __callable<_Fun, _As...> && //
     requires(_Fun&& __fun, _As&&... __as) {
         {
-            ((_Fun&&)__fun)((_As&&)__as...)
+            static_cast<_Fun&&>(__fun)(static_cast<_As&&>(__as)...)
         } noexcept;
     };
 
diff --git a/include/sdbusplus/async/stdexec/__detail/__config.hpp b/include/sdbusplus/async/stdexec/__detail/__config.hpp
index 537de40..68dfa93 100644
--- a/include/sdbusplus/async/stdexec/__detail/__config.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__config.hpp
@@ -38,8 +38,12 @@
 #define STDEXEC_EAT(...)
 
 #define STDEXEC_NOT(_XP) STDEXEC_CAT(STDEXEC_NOT_, _XP)
-#define STDEXEC_NOT_0 1
-#define STDEXEC_NOT_1 0
+
+enum
+{
+    STDEXEC_NOT_0 = 1,
+    STDEXEC_NOT_1 = 0
+};
 
 #define STDEXEC_IIF_0(_YP, ...) __VA_ARGS__
 #define STDEXEC_IIF_1(_YP, ...) _YP
diff --git a/include/sdbusplus/async/stdexec/__detail/__domain.hpp b/include/sdbusplus/async/stdexec/__detail/__domain.hpp
index 0dcc3a8..a82a1e6 100644
--- a/include/sdbusplus/async/stdexec/__detail/__domain.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__domain.hpp
@@ -46,8 +46,8 @@
 {
     template <class _Tag, class _Data, class... _Children>
         requires __has_legacy_c11n<_Tag, _Data, _Children...>
-    decltype(auto) operator()(_Tag, _Data&& __data,
-                              _Children&&... __children) const
+    auto operator()(_Tag, _Data&& __data, _Children&&... __children) const
+        -> decltype(auto)
     {
         return __legacy_c11n_fn<_Tag, _Data, _Children...>()(
             static_cast<_Data&&>(__data),
@@ -58,7 +58,7 @@
 template <class _DomainOrTag, class _Sender, class... _Env>
 concept __has_transform_sender =
     requires(_DomainOrTag __tag, _Sender&& __sender, const _Env&... __env) {
-        __tag.transform_sender((_Sender&&)__sender, __env...);
+        __tag.transform_sender(static_cast<_Sender&&>(__sender), __env...);
     };
 
 template <class _Sender, class... _Env>
@@ -69,7 +69,8 @@
 template <class _Type, class _Sender, class _Env>
 concept __has_transform_env =
     requires(_Type __obj, _Sender&& __sender, _Env&& __env) {
-        __obj.transform_env((_Sender&&)__sender, (_Env&&)__env);
+        __obj.transform_env(static_cast<_Sender&&>(__sender),
+                            static_cast<_Env&&>(__env));
     };
 
 template <class _Sender, class _Env>
@@ -78,9 +79,10 @@
     && __has_transform_env<tag_of_t<_Sender>, _Sender, _Env>;
 
 template <class _DomainOrTag, class... _Args>
-concept __has_apply_sender = requires(_DomainOrTag __tag, _Args&&... __args) {
-                                 __tag.apply_sender((_Args&&)__args...);
-                             };
+concept __has_apply_sender =
+    requires(_DomainOrTag __tag, _Args&&... __args) {
+        __tag.apply_sender(static_cast<_Args&&>(__args)...);
+    };
 } // namespace __domain
 
 struct default_domain
@@ -97,18 +99,18 @@
         if constexpr (__callable<__sexpr_apply_t, _Sender,
                                  __domain::__legacy_customization>)
         {
-            return stdexec::__sexpr_apply((_Sender&&)__sndr,
+            return stdexec::__sexpr_apply(static_cast<_Sender&&>(__sndr),
                                           __domain::__legacy_customization());
         }
         else if constexpr (__domain::__has_default_transform_sender<_Sender>)
         {
-            return tag_of_t<_Sender>().transform_sender((_Sender&&)__sndr);
+            return tag_of_t<_Sender>().transform_sender(
+                static_cast<_Sender&&>(__sndr));
         }
         else
         {
-            return static_cast<_Sender>((_Sender&&)__sndr);
+            return static_cast<_Sender>(static_cast<_Sender&&>(__sndr));
         }
-        STDEXEC_UNREACHABLE();
     }
 
     // Called with an environment during lazy customization
@@ -118,14 +120,13 @@
     {
         if constexpr (__domain::__has_default_transform_sender<_Sender, _Env>)
         {
-            return tag_of_t<_Sender>().transform_sender((_Sender&&)__sndr,
-                                                        __env);
+            return tag_of_t<_Sender>().transform_sender(
+                static_cast<_Sender&&>(__sndr), __env);
         }
         else
         {
-            return static_cast<_Sender>((_Sender&&)__sndr);
+            return static_cast<_Sender>(static_cast<_Sender&&>(__sndr));
         }
-        STDEXEC_UNREACHABLE();
     }
 
     template <class _Tag, class _Sender, class... _Args>
@@ -144,22 +145,23 @@
         }
         else
         {
-            return _Tag().apply_sender((_Sender&&)__sndr, (_Args&&)__args...);
+            return _Tag().apply_sender(static_cast<_Sender&&>(__sndr),
+                                       static_cast<_Args&&>(__args)...);
         }
-        STDEXEC_UNREACHABLE();
     }
 
     template <class _Sender, class _Env>
-    decltype(auto) transform_env(_Sender&& __sndr, _Env&& __env) const noexcept
+    auto transform_env(_Sender&& __sndr, _Env&& __env) const noexcept
+        -> decltype(auto)
     {
         if constexpr (__domain::__has_default_transform_env<_Sender, _Env>)
         {
-            return tag_of_t<_Sender>().transform_env((_Sender&&)__sndr,
-                                                     (_Env&&)__env);
+            return tag_of_t<_Sender>().transform_env(
+                static_cast<_Sender&&>(__sndr), static_cast<_Env&&>(__env));
         }
         else
         {
-            return static_cast<_Env>((_Env&&)__env);
+            return static_cast<_Env>(static_cast<_Env&&>(__env));
         }
     }
 };
@@ -223,7 +225,6 @@
         {
             return __def;
         }
-        STDEXEC_UNREACHABLE();
     }
 } __get_early_domain{};
 
@@ -259,7 +260,6 @@
         {
             return default_domain();
         }
-        STDEXEC_UNREACHABLE();
     }
 
     // The transfer algorithm is the exception to the rule. It ignores the
@@ -283,16 +283,17 @@
 {
 struct __common_domain_fn
 {
-    static default_domain __common_domain() noexcept
+    static auto __common_domain() noexcept -> default_domain
     {
         return {};
     }
 
     template <class _Domain, class... _OtherDomains>
         requires __all_of<_Domain, _OtherDomains...>
-    static _Domain __common_domain(_Domain __domain, _OtherDomains...) noexcept
+    static auto __common_domain(_Domain __domain, _OtherDomains...) noexcept
+        -> _Domain
     {
-        return (_Domain&&)__domain;
+        return static_cast<_Domain&&>(__domain);
     }
 
     template <class... _Domains>
diff --git a/include/sdbusplus/async/stdexec/__detail/__env.hpp b/include/sdbusplus/async/stdexec/__detail/__env.hpp
index d9f34b8..178b913 100644
--- a/include/sdbusplus/async/stdexec/__detail/__env.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__env.hpp
@@ -50,11 +50,11 @@
 struct forwarding_query_t
 {
     template <class _Query>
-    constexpr bool operator()(_Query __query) const noexcept
+    constexpr auto operator()(_Query __query) const noexcept -> bool
     {
         if constexpr (tag_invocable<forwarding_query_t, _Query>)
         {
-            return tag_invoke(*this, (_Query&&)__query);
+            return tag_invoke(*this, static_cast<_Query&&>(__query));
         }
         else if constexpr (std::derived_from<_Query, forwarding_query_t>)
         {
@@ -73,7 +73,7 @@
     constexpr auto operator()(_Query, _Queryable&&, _Default&& __default) const
         noexcept(__nothrow_constructible_from<_Default, _Default&&>) -> _Default
     {
-        return (_Default&&)__default;
+        return static_cast<_Default&&>(__default);
     }
 
     template <class _Query, class _Queryable, class _Default>
@@ -83,7 +83,8 @@
         noexcept(__nothrow_callable<_Query, _Queryable>)
             -> __call_result_t<_Query, _Queryable>
     {
-        return ((_Query&&)__query)((_Queryable&&)__queryable);
+        return static_cast<_Query&&>(__query)(
+            static_cast<_Queryable&&>(__queryable));
     }
 };
 
@@ -91,7 +92,7 @@
 {
     template <class _Tp>
         requires tag_invocable<execute_may_block_caller_t, __cref_t<_Tp>>
-    constexpr bool operator()(_Tp&& __t) const noexcept
+    constexpr auto operator()(_Tp&& __t) const noexcept -> bool
     {
         static_assert(
             same_as<bool, tag_invoke_result_t<execute_may_block_caller_t,
@@ -101,7 +102,7 @@
         return tag_invoke(execute_may_block_caller_t{}, std::as_const(__t));
     }
 
-    constexpr bool operator()(auto&&) const noexcept
+    constexpr auto operator()(auto&&) const noexcept -> bool
     {
         return true;
     }
@@ -120,8 +121,8 @@
                           std::as_const(__t));
     }
 
-    constexpr stdexec::forward_progress_guarantee
-        operator()(auto&&) const noexcept
+    constexpr auto operator()(auto&&) const noexcept
+        -> stdexec::forward_progress_guarantee
     {
         return stdexec::forward_progress_guarantee::weakly_parallel;
     }
@@ -136,18 +137,18 @@
 
     template <class _Tp>
         requires tag_invocable<__has_algorithm_customizations_t, __cref_t<_Tp>>
-    constexpr __result_t<_Tp> operator()(_Tp&&) const
-        noexcept(noexcept(__result_t<_Tp>{}))
+    constexpr auto operator()(_Tp&&) const noexcept(noexcept(__result_t<_Tp>{}))
+        -> __result_t<_Tp>
     {
         using _Boolean = tag_invoke_result_t<__has_algorithm_customizations_t,
                                              __cref_t<_Tp>>;
         static_assert(_Boolean{}
                           ? true
-                          : true); // must be contextually convertible to bool
+                          : false); // must be contextually convertible to bool
         return _Boolean{};
     }
 
-    constexpr std::false_type operator()(auto&&) const noexcept
+    constexpr auto operator()(auto&&) const noexcept -> std::false_type
     {
         return {};
     }
@@ -159,8 +160,8 @@
 
 struct get_scheduler_t : __query<get_scheduler_t>
 {
-    friend constexpr bool tag_invoke(forwarding_query_t,
-                                     const get_scheduler_t&) noexcept
+    friend constexpr auto tag_invoke(forwarding_query_t,
+                                     const get_scheduler_t&) noexcept -> bool
     {
         return true;
     }
@@ -170,13 +171,15 @@
     auto operator()(const _Env& __env) const noexcept
         -> tag_invoke_result_t<get_scheduler_t, const _Env&>;
 
+    template <class _Tag = get_scheduler_t>
     auto operator()() const noexcept;
 };
 
 struct get_delegatee_scheduler_t : __query<get_delegatee_scheduler_t>
 {
-    friend constexpr bool tag_invoke(forwarding_query_t,
+    friend constexpr auto tag_invoke(forwarding_query_t,
                                      const get_delegatee_scheduler_t&) noexcept
+        -> bool
     {
         return true;
     }
@@ -186,13 +189,14 @@
     auto operator()(const _Env& __t) const noexcept
         -> tag_invoke_result_t<get_delegatee_scheduler_t, const _Env&>;
 
+    template <class _Tag = get_delegatee_scheduler_t>
     auto operator()() const noexcept;
 };
 
 struct get_allocator_t : __query<get_allocator_t>
 {
-    friend constexpr bool tag_invoke(forwarding_query_t,
-                                     const get_allocator_t&) noexcept
+    friend constexpr auto tag_invoke(forwarding_query_t,
+                                     const get_allocator_t&) noexcept -> bool
     {
         return true;
     }
@@ -208,19 +212,20 @@
         return tag_invoke(get_allocator_t{}, __env);
     }
 
+    template <class _Tag = get_allocator_t>
     auto operator()() const noexcept;
 };
 
 struct get_stop_token_t : __query<get_stop_token_t>
 {
-    friend constexpr bool tag_invoke(forwarding_query_t,
-                                     const get_stop_token_t&) noexcept
+    friend constexpr auto tag_invoke(forwarding_query_t,
+                                     const get_stop_token_t&) noexcept -> bool
     {
         return true;
     }
 
     template <class _Env>
-    never_stop_token operator()(const _Env&) const noexcept
+    auto operator()(const _Env&) const noexcept -> never_stop_token
     {
         return {};
     }
@@ -236,6 +241,7 @@
         return tag_invoke(get_stop_token_t{}, __env);
     }
 
+    template <class _Tag = get_stop_token_t>
     auto operator()() const noexcept;
 };
 
@@ -247,9 +253,9 @@
 template <__completion_tag _CPO>
 struct get_completion_scheduler_t : __query<get_completion_scheduler_t<_CPO>>
 {
-    friend constexpr bool
+    friend constexpr auto
         tag_invoke(forwarding_query_t,
-                   const get_completion_scheduler_t<_CPO>&) noexcept
+                   const get_completion_scheduler_t<_CPO>&) noexcept -> bool
     {
         return true;
     }
@@ -274,7 +280,8 @@
         return tag_invoke(get_domain_t{}, __ty);
     }
 
-    friend constexpr bool tag_invoke(forwarding_query_t, get_domain_t) noexcept
+    friend constexpr auto tag_invoke(forwarding_query_t, get_domain_t) noexcept
+        -> bool
     {
         return true;
     }
@@ -337,8 +344,7 @@
 {
     template <class _EnvProvider>
         requires tag_invocable<get_env_t, const _EnvProvider&>
-    STDEXEC_ATTRIBUTE((always_inline)) //
-        constexpr auto
+    STDEXEC_ATTRIBUTE((always_inline)) constexpr auto
         operator()(const _EnvProvider& __env_provider) const noexcept
         -> tag_invoke_result_t<get_env_t, const _EnvProvider&>
     {
@@ -349,7 +355,7 @@
     }
 
     template <class _EnvProvider>
-    constexpr empty_env operator()(const _EnvProvider&) const noexcept
+    constexpr auto operator()(const _EnvProvider&) const noexcept -> empty_env
     {
         return {};
     }
@@ -360,9 +366,9 @@
 struct __promise
 {
     template <class _Ty>
-    _Ty&& await_transform(_Ty&& __value) noexcept
+    auto await_transform(_Ty&& __value) noexcept -> _Ty&&
     {
-        return (_Ty&&)__value;
+        return static_cast<_Ty&&>(__value);
     }
 
     template <class _Ty>
@@ -371,7 +377,7 @@
         noexcept(nothrow_tag_invocable<as_awaitable_t, _Ty, __promise&>)
             -> tag_invoke_result_t<as_awaitable_t, _Ty, __promise&>
     {
-        return tag_invoke(as_awaitable, (_Ty&&)__value, *this);
+        return tag_invoke(as_awaitable, static_cast<_Ty&&>(__value), *this);
     }
 
     template <same_as<get_env_t> _Tag>
@@ -386,18 +392,19 @@
 {
     using __t = __with;
     using __id = __with;
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Value __value_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Value __value_;
 
     __with() = default;
 
     constexpr explicit __with(_Value __value) noexcept(
         __nothrow_decay_copyable<_Value>) :
-        __value_((_Value&&)__value)
+        __value_(static_cast<_Value&&>(__value))
     {}
 
     constexpr explicit __with(_Value __value, _Tag, _Tags...) noexcept(
         __nothrow_decay_copyable<_Value>) :
-        __value_((_Value&&)__value)
+        __value_(static_cast<_Value&&>(__value))
     {}
 
     template <__one_of<_Tag, _Tags...> _Key>
@@ -417,7 +424,8 @@
     static_assert(__nothrow_move_constructible<_Env>);
     using __t = __fwd;
     using __id = __fwd;
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Env __env_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Env __env_;
 
     template <__forwarding_query _Tag>
         requires tag_invocable<_Tag, const _Env&>
@@ -459,11 +467,11 @@
     {
         if constexpr (same_as<_Env, _Env&>)
         {
-            return __ref{(_Env&&)__env};
+            return __ref{static_cast<_Env&&>(__env)};
         }
         else
         {
-            return (_Env&&)__env;
+            return static_cast<_Env&&>(__env);
         }
     }
 };
@@ -476,7 +484,7 @@
     using __id = __without_;
 
     constexpr explicit __without_(_Env&& __env, _Tag, _Tags...) noexcept :
-        _Env((_Env&&)__env)
+        _Env(static_cast<_Env&&>(__env))
     {}
 
     template <__one_of<_Tag, _Tags...> _Key, class _Self>
@@ -487,17 +495,18 @@
 struct __without_fn
 {
     template <class _Env, class _Tag, class... _Tags>
-    constexpr decltype(auto) operator()(_Env&& __env, _Tag,
-                                        _Tags...) const noexcept
+    constexpr auto operator()(_Env&& __env, _Tag, _Tags...) const noexcept
+        -> decltype(auto)
     {
         if constexpr (tag_invocable<_Tag, _Env> ||
                       (tag_invocable<_Tags, _Env> || ...))
         {
-            return __without_{__ref_fn()((_Env&&)__env), _Tag(), _Tags()...};
+            return __without_{__ref_fn()(static_cast<_Env&&>(__env)), _Tag(),
+                              _Tags()...};
         }
         else
         {
-            return static_cast<_Env>((_Env&&)__env);
+            return static_cast<_Env>(static_cast<_Env&&>(__env));
         }
     }
 };
@@ -515,7 +524,8 @@
     using __t = __joined;
     using __id = __joined;
 
-    STDEXEC_ATTRIBUTE((no_unique_address)) _First __env_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _First __env_;
 
     template <class _Tag>
         requires tag_invocable<_Tag, const _First&>
@@ -535,7 +545,8 @@
 {
     using __t = __from;
     using __id = __from;
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Fun __fun_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Fun __fun_;
 
     template <class _Tag>
         requires __callable<const _Fun&, _Tag>
@@ -555,10 +566,10 @@
     template <class Env>
     auto operator()(Env&& env) const
     {
-        return __fwd{(Env&&)env};
+        return __fwd{static_cast<Env&&>(env)};
     }
 
-    empty_env operator()(empty_env) const
+    auto operator()(empty_env) const -> empty_env
     {
         return {};
     }
@@ -566,44 +577,44 @@
 
 struct __join_fn
 {
-    empty_env operator()() const
+    auto operator()() const -> empty_env
     {
         return {};
     }
 
     template <class _Env>
-    _Env operator()(_Env&& __env) const
+    auto operator()(_Env&& __env) const -> _Env
     {
-        return (_Env&&)__env;
+        return static_cast<_Env&&>(__env);
     }
 
-    empty_env operator()(empty_env) const
+    auto operator()(empty_env) const -> empty_env
     {
         return {};
     }
 
     template <class _Env>
-    _Env operator()(_Env&& __env, empty_env) const
+    auto operator()(_Env&& __env, empty_env) const -> _Env
     {
-        return (_Env&&)__env;
+        return static_cast<_Env&&>(__env);
     }
 
-    empty_env operator()(empty_env, empty_env) const
+    auto operator()(empty_env, empty_env) const -> empty_env
     {
         return {};
     }
 
     template <class... Rest>
-    decltype(auto) operator()(empty_env, Rest&&... rest) const
+    auto operator()(empty_env, Rest&&... rest) const -> decltype(auto)
     {
-        return __fwd_fn()(__join_fn()((Rest&&)rest...));
+        return __fwd_fn()(__join_fn()(static_cast<Rest&&>(rest)...));
     }
 
     template <class First, class... Rest>
-    decltype(auto) operator()(First&& first, Rest&&... rest) const
+    auto operator()(First&& first, Rest&&... rest) const -> decltype(auto)
     {
-        return __joined{__fwd_fn()(__join_fn()((Rest&&)rest...)),
-                        (First&&)first};
+        return __joined{__fwd_fn()(__join_fn()(static_cast<Rest&&>(rest)...)),
+                        static_cast<First&&>(first)};
     }
 };
 
diff --git a/include/sdbusplus/async/stdexec/__detail/__execution_fwd.hpp b/include/sdbusplus/async/stdexec/__detail/__execution_fwd.hpp
index 760ae84..43e123a 100644
--- a/include/sdbusplus/async/stdexec/__detail/__execution_fwd.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__execution_fwd.hpp
@@ -128,7 +128,7 @@
 namespace __get_completion_signatures
 {
 struct get_completion_signatures_t;
-}
+} // namespace __get_completion_signatures
 
 using __get_completion_signatures::get_completion_signatures_t;
 extern const get_completion_signatures_t get_completion_signatures;
@@ -137,7 +137,7 @@
 namespace __connect
 {
 struct connect_t;
-}
+} // namespace __connect
 
 using __connect::connect_t;
 extern const connect_t connect;
@@ -158,7 +158,7 @@
 namespace __start
 {
 struct start_t;
-}
+} // namespace __start
 
 using __start::start_t;
 extern const start_t start;
@@ -167,7 +167,7 @@
 namespace __schedule
 {
 struct schedule_t;
-}
+} // namespace __schedule
 
 using __schedule::schedule_t;
 extern const schedule_t schedule;
@@ -176,7 +176,7 @@
 namespace __as_awaitable
 {
 struct as_awaitable_t;
-}
+} // namespace __as_awaitable
 
 using __as_awaitable::as_awaitable_t;
 extern const as_awaitable_t as_awaitable;
@@ -185,7 +185,7 @@
 namespace __transfer
 {
 struct transfer_t;
-}
+} // namespace __transfer
 
 using __transfer::transfer_t;
 extern const transfer_t transfer;
@@ -194,7 +194,7 @@
 namespace __transfer_just
 {
 struct transfer_just_t;
-}
+} // namespace __transfer_just
 
 using __transfer_just::transfer_just_t;
 extern const transfer_just_t transfer_just;
@@ -203,7 +203,7 @@
 namespace __bulk
 {
 struct bulk_t;
-}
+} // namespace __bulk
 
 using __bulk::bulk_t;
 extern const bulk_t bulk;
@@ -232,17 +232,17 @@
 namespace __on_v2
 {
 struct on_t;
-}
+} // namespace __on_v2
 
 namespace v2
 {
 using __on_v2::on_t;
-}
+} // namespace v2
 
 namespace __detail
 {
 struct __sexpr_apply_t;
-}
+} // namespace __detail
 
 using __detail::__sexpr_apply_t;
 extern const __sexpr_apply_t __sexpr_apply;
diff --git a/include/sdbusplus/async/stdexec/__detail/__intrusive_ptr.hpp b/include/sdbusplus/async/stdexec/__detail/__intrusive_ptr.hpp
index efb1399..9897a0b 100644
--- a/include/sdbusplus/async/stdexec/__detail/__intrusive_ptr.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__intrusive_ptr.hpp
@@ -42,8 +42,8 @@
 template <class _Ty>
 struct __enable_intrusive_from_this
 {
-    __intrusive_ptr<_Ty> __intrusive_from_this() noexcept;
-    __intrusive_ptr<const _Ty> __intrusive_from_this() const noexcept;
+    auto __intrusive_from_this() noexcept -> __intrusive_ptr<_Ty>;
+    auto __intrusive_from_this() const noexcept -> __intrusive_ptr<const _Ty>;
 
   private:
     friend _Ty;
@@ -68,7 +68,7 @@
         // Construct the value *after* the initialization of the
         // atomic in case the constructor of _Ty calls
         // __intrusive_from_this() (which increments the atomic):
-        ::new ((void*)__value_) _Ty{(_Us&&)__us...};
+        ::new (static_cast<void*>(__value_)) _Ty{static_cast<_Us&&>(__us)...};
     }
 
     ~__control_block()
@@ -76,9 +76,9 @@
         __value().~_Ty();
     }
 
-    _Ty& __value() const noexcept
+    auto __value() noexcept -> _Ty&
     {
-        return *(_Ty*)__value_;
+        return *reinterpret_cast<_Ty*>(__value_);
     }
 
     void __inc_ref_() noexcept
@@ -150,20 +150,20 @@
                                : __intrusive_ptr())
     {}
 
-    __intrusive_ptr& operator=(__intrusive_ptr&& __that) noexcept
+    auto operator=(__intrusive_ptr&& __that) noexcept -> __intrusive_ptr&
     {
         [[maybe_unused]] __intrusive_ptr __old{
             std::exchange(__data_, std::exchange(__that.__data_, nullptr))};
         return *this;
     }
 
-    __intrusive_ptr& operator=(const __intrusive_ptr& __that) noexcept
+    auto operator=(const __intrusive_ptr& __that) noexcept -> __intrusive_ptr&
     {
         return operator=(__intrusive_ptr(__that));
     }
 
-    __intrusive_ptr&
-        operator=(__enable_intrusive_from_this<_Ty>* __that) noexcept
+    auto operator=(__enable_intrusive_from_this<_Ty>* __that) noexcept
+        -> __intrusive_ptr&
     {
         return operator=(__that ? __that->__intrusive_from_this()
                                 : __intrusive_ptr());
@@ -184,17 +184,17 @@
         std::swap(__data_, __that.__data_);
     }
 
-    _Ty* get() const noexcept
+    auto get() const noexcept -> _Ty*
     {
         return &__data_->__value();
     }
 
-    _Ty* operator->() const noexcept
+    auto operator->() const noexcept -> _Ty*
     {
         return &__data_->__value();
     }
 
-    _Ty& operator*() const noexcept
+    auto operator*() const noexcept -> _Ty&
     {
         return __data_->__value();
     }
@@ -204,33 +204,35 @@
         return __data_ != nullptr;
     }
 
-    bool operator!() const noexcept
+    auto operator!() const noexcept -> bool
     {
         return __data_ == nullptr;
     }
 
-    bool operator==(const __intrusive_ptr&) const = default;
+    auto operator==(const __intrusive_ptr&) const -> bool = default;
 
-    bool operator==(std::nullptr_t) const noexcept
+    auto operator==(std::nullptr_t) const noexcept -> bool
     {
         return __data_ == nullptr;
     }
 };
 
 template <class _Ty>
-__intrusive_ptr<_Ty>
-    __enable_intrusive_from_this<_Ty>::__intrusive_from_this() noexcept
+auto __enable_intrusive_from_this<_Ty>::__intrusive_from_this() noexcept
+    -> __intrusive_ptr<_Ty>
 {
-    auto* __data = (__control_block<_Ty>*)static_cast<_Ty*>(this);
+    auto* __data =
+        reinterpret_cast<__control_block<_Ty>*>(static_cast<_Ty*>(this));
     __data->__inc_ref_();
     return __intrusive_ptr<_Ty>{__data};
 }
 
 template <class _Ty>
-__intrusive_ptr<const _Ty>
-    __enable_intrusive_from_this<_Ty>::__intrusive_from_this() const noexcept
+auto __enable_intrusive_from_this<_Ty>::__intrusive_from_this() const noexcept
+    -> __intrusive_ptr<const _Ty>
 {
-    auto* __data = (__control_block<_Ty>*)static_cast<const _Ty*>(this);
+    auto* __data =
+        reinterpret_cast<__control_block<_Ty>*>(static_cast<const _Ty*>(this));
     __data->__inc_ref_();
     return __intrusive_ptr<const _Ty>{__data};
 }
@@ -238,14 +240,16 @@
 template <class _Ty>
 void __enable_intrusive_from_this<_Ty>::__inc_ref() noexcept
 {
-    auto* __data = (__control_block<_Ty>*)static_cast<_Ty*>(this);
+    auto* __data =
+        reinterpret_cast<__control_block<_Ty>*>(static_cast<_Ty*>(this));
     __data->__inc_ref_();
 }
 
 template <class _Ty>
 void __enable_intrusive_from_this<_Ty>::__dec_ref() noexcept
 {
-    auto* __data = (__control_block<_Ty>*)static_cast<_Ty*>(this);
+    auto* __data =
+        reinterpret_cast<__control_block<_Ty>*>(static_cast<_Ty*>(this));
     __data->__dec_ref_();
 }
 
@@ -254,11 +258,11 @@
 {
     template <class... _Us>
         requires constructible_from<_Ty, _Us...>
-    __intrusive_ptr<_Ty> operator()(_Us&&... __us) const
+    auto operator()(_Us&&... __us) const -> __intrusive_ptr<_Ty>
     {
         using _UncvTy = std::remove_cv_t<_Ty>;
         return __intrusive_ptr<_Ty>{
-            ::new __control_block<_UncvTy>{(_Us&&)__us...}};
+            ::new __control_block<_UncvTy>{static_cast<_Us&&>(__us)...}};
     }
 };
 } // namespace __ptr
diff --git a/include/sdbusplus/async/stdexec/__detail/__intrusive_queue.hpp b/include/sdbusplus/async/stdexec/__detail/__intrusive_queue.hpp
index ee577de..dbcccf4 100644
--- a/include/sdbusplus/async/stdexec/__detail/__intrusive_queue.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__intrusive_queue.hpp
@@ -44,7 +44,7 @@
         __head_(__head), __tail_(__tail)
     {}
 
-    __intrusive_queue& operator=(__intrusive_queue __other) noexcept
+    auto operator=(__intrusive_queue __other) noexcept -> __intrusive_queue&
     {
         std::swap(__head_, __other.__head_);
         std::swap(__tail_, __other.__tail_);
@@ -56,7 +56,7 @@
         STDEXEC_ASSERT(empty());
     }
 
-    static __intrusive_queue make_reversed(_Item* __list) noexcept
+    static auto make_reversed(_Item* __list) noexcept -> __intrusive_queue
     {
         _Item* __new_head = nullptr;
         _Item* __new_tail = __list;
@@ -74,7 +74,7 @@
         return __result;
     }
 
-    static __intrusive_queue make(_Item* __list) noexcept
+    static auto make(_Item* __list) noexcept -> __intrusive_queue
     {
         __intrusive_queue __result{};
         __result.__head_ = __list;
@@ -90,7 +90,7 @@
         return __result;
     }
 
-    [[nodiscard]] bool empty() const noexcept
+    [[nodiscard]] auto empty() const noexcept -> bool
     {
         return __head_ == nullptr;
     }
@@ -101,7 +101,7 @@
         __tail_ = nullptr;
     }
 
-    [[nodiscard]] _Item* pop_front() noexcept
+    [[nodiscard]] auto pop_front() noexcept -> _Item*
     {
         STDEXEC_ASSERT(!empty());
         _Item* __item = std::exchange(__head_, __head_->*_Next);
@@ -187,19 +187,19 @@
             __predecessor_(__pred), __item_(__item)
         {}
 
-        [[nodiscard]] _Item* operator*() const noexcept
+        [[nodiscard]] auto operator*() const noexcept -> _Item*
         {
             STDEXEC_ASSERT(__item_ != nullptr);
             return __item_;
         }
 
-        [[nodiscard]] _Item** operator->() const noexcept
+        [[nodiscard]] auto operator->() const noexcept -> _Item**
         {
             STDEXEC_ASSERT(__item_ != nullptr);
             return &__item_;
         }
 
-        iterator& operator++() noexcept
+        auto operator++() noexcept -> iterator&
         {
             __predecessor_ = __item_;
             if (__item_)
@@ -209,23 +209,23 @@
             return *this;
         }
 
-        iterator operator++(int) noexcept
+        auto operator++(int) noexcept -> iterator
         {
             iterator __result = *this;
             ++*this;
             return __result;
         }
 
-        friend bool operator==(const iterator&,
-                               const iterator&) noexcept = default;
+        friend auto operator==(const iterator&, const iterator&) noexcept
+            -> bool = default;
     };
 
-    [[nodiscard]] iterator begin() const noexcept
+    [[nodiscard]] auto begin() const noexcept -> iterator
     {
         return iterator(nullptr, __head_);
     }
 
-    [[nodiscard]] iterator end() const noexcept
+    [[nodiscard]] auto end() const noexcept -> iterator
     {
         return iterator(__tail_, nullptr);
     }
@@ -268,12 +268,12 @@
         }
     }
 
-    _Item* front() const noexcept
+    auto front() const noexcept -> _Item*
     {
         return __head_;
     }
 
-    _Item* back() const noexcept
+    auto back() const noexcept -> _Item*
     {
         return __tail_;
     }
diff --git a/include/sdbusplus/async/stdexec/__detail/__meta.hpp b/include/sdbusplus/async/stdexec/__detail/__meta.hpp
index b350b99..a926d68 100644
--- a/include/sdbusplus/async/stdexec/__detail/__meta.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__meta.hpp
@@ -38,13 +38,19 @@
 {
     __ignore() = default;
 
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     constexpr __ignore(auto&&...) noexcept {}
 };
 
 struct __none_such
 {};
 
+namespace
+{
+struct __anon
+{};
+} // namespace
+
 struct __immovable
 {
     __immovable() = default;
@@ -58,10 +64,10 @@
     __move_only() = default;
 
     __move_only(__move_only&&) noexcept = default;
-    __move_only& operator=(__move_only&&) noexcept = default;
+    auto operator=(__move_only&&) noexcept -> __move_only& = default;
 
     __move_only(const __move_only&) = delete;
-    __move_only& operator=(const __move_only&) = delete;
+    auto operator=(const __move_only&) -> __move_only& = delete;
 };
 
 template <class _Tp>
@@ -152,18 +158,19 @@
     constexpr __mstring(_Char... __chars) noexcept : __what_{__chars...}
     {}
 
-    static constexpr std::size_t __length() noexcept
+    static constexpr auto __length() noexcept -> std::size_t
     {
         return _Len;
     }
 
     template <std::size_t... _Is>
-    constexpr bool __equal(__mstring __other, __indices<_Is...>) const noexcept
+    constexpr auto __equal(__mstring __other, __indices<_Is...>) const noexcept
+        -> bool
     {
         return ((__what_[_Is] == __other.__what_[_Is]) && ...);
     }
 
-    constexpr bool operator==(__mstring __other) const noexcept
+    constexpr auto operator==(__mstring __other) const noexcept -> bool
     {
         return __equal(__other, __make_indices<_Len>());
     }
@@ -210,15 +217,15 @@
 #else
 // Use a standard user-defined string literal template
 template <__mstring _Str>
-[[deprecated("Use _mstr instead")]] constexpr __mtypeof<_Str>
-    operator""__csz() noexcept
+[[deprecated("Use _mstr instead")]] constexpr auto operator""__csz() noexcept
+    -> __mtypeof<_Str>
 {
     return _Str;
 }
 
 // Use a standard user-defined string literal template
 template <__mstring _Str>
-constexpr __mtypeof<_Str> operator""_mstr() noexcept
+constexpr auto operator""_mstr() noexcept -> __mtypeof<_Str>
 {
     return _Str;
 }
@@ -235,7 +242,7 @@
 template <class _What, class... _With>
 struct _ERROR_
 {
-    _ERROR_ operator,(__msuccess) const noexcept;
+    auto operator,(__msuccess) const noexcept -> _ERROR_;
 };
 
 template <__mstring _What>
@@ -852,12 +859,12 @@
 
     operator __t() && noexcept(__nothrow_callable<_Fn>)
     {
-        return ((_Fn&&)__fn_)();
+        return static_cast<_Fn&&>(__fn_)();
     }
 
-    __t operator()() && noexcept(__nothrow_callable<_Fn>)
+    auto operator()() && noexcept(__nothrow_callable<_Fn>) -> __t
     {
-        return ((_Fn&&)__fn_)();
+        return static_cast<_Fn&&>(__fn_)();
     }
 };
 template <class _Fn>
@@ -868,7 +875,7 @@
 struct __cref_fn
 {
     template <class _Ty>
-    const _Ty& operator()(const _Ty&);
+    auto operator()(const _Ty&) -> const _Ty&;
 };
 template <class _Ty>
 using __cref_t = decltype(__cref_fn{}(__declval<_Ty>()));
@@ -908,11 +915,11 @@
     decltype(stdexec::__mconvert_indices<std::make_index_sequence<_Np>>);
 #else
 template <std::size_t... _Indices>
-__types<__msize_t<_Indices>...>
-    __mconvert_indices(std::index_sequence<_Indices...>*);
+auto __mconvert_indices(std::index_sequence<_Indices...>*)
+    -> __types<__msize_t<_Indices>...>;
 template <std::size_t _Np>
 using __mmake_index_sequence = decltype(stdexec::__mconvert_indices(
-    (std::make_index_sequence<_Np>*)nullptr));
+    static_cast<std::make_index_sequence<_Np>*>(nullptr)));
 #endif
 
 template <class... _Ts>
@@ -1052,8 +1059,8 @@
 
     constexpr __placeholder(void*) noexcept {}
 
-    friend constexpr std::size_t
-        __get_placeholder_offset(__placeholder) noexcept
+    friend constexpr auto __get_placeholder_offset(__placeholder) noexcept
+        -> std::size_t
     {
         return _Np;
     }
@@ -1084,10 +1091,10 @@
 struct __nth_pack_element_impl
 {
     template <class _Ty, class... _Us>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     constexpr _Ty&& operator()(_Ignore..., _Ty&& __t, _Us&&...) const noexcept
     {
-        return (decltype(__t)&&)__t;
+        return static_cast<decltype(__t)&&>(__t);
     }
 };
 
@@ -1095,18 +1102,18 @@
 struct __nth_pack_element_t
 {
     template <std::size_t... _Is>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     static constexpr auto __impl(__indices<_Is...>) noexcept
     {
         return __nth_pack_element_impl<__ignore_t<_Is>...>();
     }
 
     template <class... _Ts>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     constexpr decltype(auto) operator()(_Ts&&... __ts) const noexcept
     {
         static_assert(_Np < sizeof...(_Ts));
-        return __impl(__make_indices<_Np>())((_Ts&&)__ts...);
+        return __impl(__make_indices<_Np>())(static_cast<_Ts&&>(__ts)...);
     }
 };
 
@@ -1117,7 +1124,7 @@
 struct __mliterals
 {
     template <std::size_t _Np>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     static constexpr auto __nth() noexcept
     {
         return stdexec::__nth_pack_element<_Np>(_Vs...);
@@ -1128,10 +1135,10 @@
 struct __nth_member
 {
     template <class _Ty>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     constexpr decltype(auto) operator()(_Ty&& __ty) const noexcept
     {
-        return ((_Ty&&)__ty).*(__ty.__mbrs_.template __nth<_Np>());
+        return static_cast<_Ty&&>(__ty).*(__ty.__mbrs_.template __nth<_Np>());
     }
 };
 
@@ -1139,7 +1146,7 @@
 struct __mdispatch_
 {
     template <class... _Ts>
-    _Ty operator()(_Ts&&...) const noexcept(noexcept(_Ty{}))
+    auto operator()(_Ts&&...) const noexcept(noexcept(_Ty{})) -> _Ty
     {
         return _Ty{};
     }
@@ -1149,9 +1156,10 @@
 struct __mdispatch_<__placeholder<_Np>, _Offset>
 {
     template <class... _Ts>
-    decltype(auto) operator()(_Ts&&... __ts) const noexcept
+    auto operator()(_Ts&&... __ts) const noexcept -> decltype(auto)
     {
-        return stdexec::__nth_pack_element<_Np + _Offset>((_Ts&&)__ts...);
+        return stdexec::__nth_pack_element<_Np + _Offset>(
+            static_cast<_Ts&&>(__ts)...);
     }
 };
 
@@ -1159,7 +1167,7 @@
 struct __mdispatch_<__placeholder<_Np>&, _Offset>
 {
     template <class... _Ts>
-    decltype(auto) operator()(_Ts&&... __ts) const noexcept
+    auto operator()(_Ts&&... __ts) const noexcept -> decltype(auto)
     {
         return stdexec::__nth_pack_element<_Np + _Offset>(__ts...);
     }
@@ -1169,7 +1177,7 @@
 struct __mdispatch_<__placeholder<_Np>&&, _Offset>
 {
     template <class... _Ts>
-    decltype(auto) operator()(_Ts&&... __ts) const noexcept
+    auto operator()(_Ts&&... __ts) const noexcept -> decltype(auto)
     {
         return std::move(stdexec::__nth_pack_element<_Np + _Offset>(__ts...));
     }
@@ -1179,7 +1187,7 @@
 struct __mdispatch_<const __placeholder<_Np>&, _Offset>
 {
     template <class... _Ts>
-    decltype(auto) operator()(_Ts&&... __ts) const noexcept
+    auto operator()(_Ts&&... __ts) const noexcept -> decltype(auto)
     {
         return std::as_const(
             stdexec::__nth_pack_element<_Np + _Offset>(__ts...));
@@ -1199,7 +1207,8 @@
         -> __call_result_t<
             _Ret, __call_result_t<__mdispatch_<_Args, _Offset>, _Ts...>...>
     {
-        return _Ret{}(__mdispatch_<_Args, _Offset>{}((_Ts&&)__ts...)...);
+        return _Ret{}(
+            __mdispatch_<_Args, _Offset>{}(static_cast<_Ts&&>(__ts)...)...);
     }
 };
 
@@ -1209,7 +1218,7 @@
     static_assert(_Offset == 0, "nested pack expressions are not supported");
     using _Pattern = __mback<_Args...>;
     static constexpr std::size_t __offset =
-        __get_placeholder_offset((__mtype<_Pattern>*)nullptr);
+        __get_placeholder_offset(static_cast<__mtype<_Pattern>*>(nullptr));
 
     struct __impl
     {
@@ -1230,9 +1239,10 @@
                 _Ret, __call_result_t<__mdispatch_<_Args>, _Ts...>...,
                 __call_result_t<__mdispatch_<_Pattern, _Idx + 1>, _Ts...>...>
         {
-            return _Ret()(                                //
-                __mdispatch_<_Args>()((_Ts&&)__ts...)..., //
-                __mdispatch_<_Pattern, _Idx + 1>()((_Ts&&)__ts...)...);
+            return _Ret()(                                             //
+                __mdispatch_<_Args>()(static_cast<_Ts&&>(__ts)...)..., //
+                __mdispatch_<_Pattern, _Idx + 1>()(
+                    static_cast<_Ts&&>(__ts)...)...);
         }
     };
 
@@ -1250,7 +1260,7 @@
                 __impl, __make_indices<sizeof...(_Ts) - __offset - 1>, _Ts...>>
     {
         return __impl()(__make_indices<sizeof...(_Ts) - __offset - 1>(),
-                        (_Ts&&)__ts...);
+                        static_cast<_Ts&&>(__ts)...);
     }
 
     template <class... _Ts>
@@ -1269,7 +1279,7 @@
                     _Ts...>>
     {
         return __mdispatch_<__minvoke<__mpop_back<__qf<_Ret>>, _Args...>*>()(
-            (_Ts&&)__ts...);
+            static_cast<_Ts&&>(__ts)...);
     }
 };
 
diff --git a/include/sdbusplus/async/stdexec/__detail/__ranges.hpp b/include/sdbusplus/async/stdexec/__detail/__ranges.hpp
index f18f84a..e98513e 100644
--- a/include/sdbusplus/async/stdexec/__detail/__ranges.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__ranges.hpp
@@ -45,37 +45,41 @@
 void end();
 
 template <class _Ty>
-concept __has_member_begin = requires(_Ty&& __v) { ((_Ty&&)__v).begin(); };
+concept __has_member_begin =
+    requires(_Ty&& __v) { static_cast<_Ty&&>(__v).begin(); };
 
 template <class _Ty>
-concept __has_free_begin = __has_member_begin<_Ty> ||
-                           requires(_Ty&& __v) { begin(((_Ty&&)__v)); };
+concept __has_free_begin =
+    __has_member_begin<_Ty> ||
+    requires(_Ty&& __v) { begin((static_cast<_Ty&&>(__v))); };
 
 template <class _Ty>
-concept __has_member_end = requires(_Ty&& __v) { ((_Ty&&)__v).end(); };
+concept __has_member_end =
+    requires(_Ty&& __v) { static_cast<_Ty&&>(__v).end(); };
 
 template <class _Ty>
-concept __has_free_end = __has_member_end<_Ty> ||
-                         requires(_Ty&& __v) { end(((_Ty&&)__v)); };
+concept __has_free_end =
+    __has_member_end<_Ty> ||
+    requires(_Ty&& __v) { end((static_cast<_Ty&&>(__v))); };
 
 struct __begin_t
 {
     template <class _Range>
         requires __has_member_begin<_Range>
     auto operator()(_Range&& __rng) const
-        noexcept(noexcept(((_Range&&)__rng).begin()))
-            -> decltype(((_Range&&)__rng).begin())
+        noexcept(noexcept((static_cast<_Range&&>(__rng)).begin()))
+            -> decltype((static_cast<_Range&&>(__rng)).begin())
     {
-        return ((_Range&&)__rng).begin();
+        return static_cast<_Range&&>(__rng).begin();
     }
 
     template <class _Range>
         requires __has_free_begin<_Range>
     auto operator()(_Range&& __rng) const
-        noexcept(noexcept(begin(((_Range&&)__rng))))
-            -> decltype(begin(((_Range&&)__rng)))
+        noexcept(noexcept(begin((static_cast<_Range&&>(__rng)))))
+            -> decltype(begin((static_cast<_Range&&>(__rng))))
     {
-        return begin(((_Range&&)__rng));
+        return begin((static_cast<_Range&&>(__rng)));
     }
 };
 
@@ -84,19 +88,19 @@
     template <class _Range>
         requires __has_member_end<_Range>
     auto operator()(_Range&& __rng) const
-        noexcept(noexcept(((_Range&&)__rng).end()))
-            -> decltype(((_Range&&)__rng).end())
+        noexcept(noexcept((static_cast<_Range&&>(__rng)).end()))
+            -> decltype((static_cast<_Range&&>(__rng)).end())
     {
-        return ((_Range&&)__rng).end();
+        return static_cast<_Range&&>(__rng).end();
     }
 
     template <class _Range>
         requires __has_free_end<_Range>
     auto operator()(_Range&& __rng) const
-        noexcept(noexcept(end(((_Range&&)__rng))))
-            -> decltype(end(((_Range&&)__rng)))
+        noexcept(noexcept(end((static_cast<_Range&&>(__rng)))))
+            -> decltype(end((static_cast<_Range&&>(__rng))))
     {
-        return end(((_Range&&)__rng));
+        return end((static_cast<_Range&&>(__rng)));
     }
 };
 } // namespace __detail
diff --git a/include/sdbusplus/async/stdexec/__detail/__scope.hpp b/include/sdbusplus/async/stdexec/__detail/__scope.hpp
index 1081269..71129a9 100644
--- a/include/sdbusplus/async/stdexec/__detail/__scope.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__scope.hpp
@@ -27,14 +27,16 @@
 template <class _Fn>
 struct __scope_guard<_Fn>
 {
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Fn __fn_;
-    STDEXEC_ATTRIBUTE((no_unique_address)) __immovable __hidden_{};
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Fn __fn_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    __immovable __hidden_{};
     bool __dismissed_{false};
 
     ~__scope_guard()
     {
         if (!__dismissed_)
-            ((_Fn&&)__fn_)();
+            static_cast<_Fn&&>(__fn_)();
     }
 
     void __dismiss() noexcept
@@ -46,9 +48,12 @@
 template <class _Fn, class _T0>
 struct __scope_guard<_Fn, _T0>
 {
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Fn __fn_;
-    STDEXEC_ATTRIBUTE((no_unique_address)) _T0 __t0_;
-    STDEXEC_ATTRIBUTE((no_unique_address)) __immovable __hidden_{};
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Fn __fn_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _T0 __t0_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    __immovable __hidden_{};
 
     bool __dismissed_{false};
 
@@ -60,17 +65,21 @@
     ~__scope_guard()
     {
         if (!__dismissed_)
-            ((_Fn&&)__fn_)((_T0&&)__t0_);
+            static_cast<_Fn&&>(__fn_)(static_cast<_T0&&>(__t0_));
     }
 };
 
 template <class _Fn, class _T0, class _T1>
 struct __scope_guard<_Fn, _T0, _T1>
 {
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Fn __fn_;
-    STDEXEC_ATTRIBUTE((no_unique_address)) _T0 __t0_;
-    STDEXEC_ATTRIBUTE((no_unique_address)) _T1 __t1_;
-    STDEXEC_ATTRIBUTE((no_unique_address)) __immovable __hidden_{};
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Fn __fn_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _T0 __t0_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _T1 __t1_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    __immovable __hidden_{};
 
     bool __dismissed_{false};
 
@@ -82,18 +91,24 @@
     ~__scope_guard()
     {
         if (!__dismissed_)
-            ((_Fn&&)__fn_)((_T0&&)__t0_, (_T1&&)__t1_);
+            static_cast<_Fn&&>(__fn_)(static_cast<_T0&&>(__t0_),
+                                      static_cast<_T1&&>(__t1_));
     }
 };
 
 template <class _Fn, class _T0, class _T1, class _T2>
 struct __scope_guard<_Fn, _T0, _T1, _T2>
 {
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Fn __fn_;
-    STDEXEC_ATTRIBUTE((no_unique_address)) _T0 __t0_;
-    STDEXEC_ATTRIBUTE((no_unique_address)) _T1 __t1_;
-    STDEXEC_ATTRIBUTE((no_unique_address)) _T2 __t2_;
-    STDEXEC_ATTRIBUTE((no_unique_address)) __immovable __hidden_{};
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Fn __fn_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _T0 __t0_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _T1 __t1_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _T2 __t2_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    __immovable __hidden_{};
 
     bool __dismissed_{false};
 
@@ -105,7 +120,9 @@
     ~__scope_guard()
     {
         if (!__dismissed_)
-            ((_Fn&&)__fn_)((_T0&&)__t0_, (_T1&&)__t1_, (_T2&&)__t2_);
+            static_cast<_Fn&&>(__fn_)(static_cast<_T0&&>(__t0_),
+                                      static_cast<_T1&&>(__t1_),
+                                      static_cast<_T2&&>(__t2_));
     }
 };
 
diff --git a/include/sdbusplus/async/stdexec/__detail/__tuple.hpp b/include/sdbusplus/async/stdexec/__detail/__tuple.hpp
index d5939f5..b1239a7 100644
--- a/include/sdbusplus/async/stdexec/__detail/__tuple.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__tuple.hpp
@@ -60,7 +60,7 @@
 STDEXEC_ATTRIBUTE((always_inline))
 constexpr _Ty&& __get(__box<_Ty, _Idx>&& __self) noexcept
 {
-    return (_Ty&&)__self.__value;
+    return static_cast<_Ty&&>(__self.__value);
 }
 
 template <std::size_t _Idx, class _Ty>
@@ -95,7 +95,7 @@
                                                                        _Ts>...>)
         -> __call_result_t<_Fun, __copy_cvref_t<_Tuple, _Ts>...>
     {
-        return ((_Fun&&)__fun)(
+        return static_cast<_Fun&&>(__fun)(
             static_cast<__copy_cvref_t<_Tuple, __box<_Ts, _Idx>>&&>(__tup)
                 .__value...);
     }
@@ -104,10 +104,13 @@
 template <class _Fun, __tuple_like _Tuple>
 STDEXEC_ATTRIBUTE((always_inline))
 constexpr auto __apply(_Fun&& __fun, _Tuple&& __tup) noexcept(
-    noexcept(__apply_()((_Fun&&)__fun, (_Tuple&&)__tup, &__tup)))
-    -> decltype(__apply_()((_Fun&&)__fun, (_Tuple&&)__tup, &__tup))
+    noexcept(__apply_()(static_cast<_Fun&&>(__fun),
+                        static_cast<_Tuple&&>(__tup), &__tup)))
+    -> decltype(__apply_()(static_cast<_Fun&&>(__fun),
+                           static_cast<_Tuple&&>(__tup), &__tup))
 {
-    return __apply_()((_Fun&&)__fun, (_Tuple&&)__tup, &__tup);
+    return __apply_()(static_cast<_Fun&&>(__fun), static_cast<_Tuple&&>(__tup),
+                      &__tup);
 }
 } // namespace __tup
 
diff --git a/include/sdbusplus/async/stdexec/__detail/__type_traits.hpp b/include/sdbusplus/async/stdexec/__detail/__type_traits.hpp
index 0e8cae5..8b134ed 100644
--- a/include/sdbusplus/async/stdexec/__detail/__type_traits.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__type_traits.hpp
@@ -23,7 +23,7 @@
 //////////////////////////////////////////////////////////////////////////////////////////////////
 // A very simple std::declval replacement that doesn't handle void
 template <class _Tp>
-_Tp&& __declval() noexcept;
+auto __declval() noexcept -> _Tp&&;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////
 // __decay_t: An efficient implementation for std::decay
@@ -189,8 +189,8 @@
 namespace __tt
 {
 template <class _Ty>
-_Ty __remove_rvalue_reference_fn(_Ty&&);
-}
+auto __remove_rvalue_reference_fn(_Ty&&) -> _Ty;
+} // namespace __tt
 
 template <class _Ty>
 using __remove_rvalue_reference_t =
diff --git a/include/sdbusplus/async/stdexec/__detail/__utility.hpp b/include/sdbusplus/async/stdexec/__detail/__utility.hpp
index 4d6a1c1..5f3f68a 100644
--- a/include/sdbusplus/async/stdexec/__detail/__utility.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__utility.hpp
@@ -30,7 +30,7 @@
     return static_cast<
         typename _Cpcvref::template __f<std::remove_reference_t<_Uy>>>(__uy);
 };
-}
+} // namespace __detail
 
 template <class _Ty>
 inline constexpr const auto& __forward_like =
diff --git a/include/sdbusplus/async/stdexec/any_sender_of.hpp b/include/sdbusplus/async/stdexec/any_sender_of.hpp
index 6805648..e65118c 100644
--- a/include/sdbusplus/async/stdexec/any_sender_of.hpp
+++ b/include/sdbusplus/async/stdexec/any_sender_of.hpp
@@ -35,8 +35,8 @@
     template <class _VTable, class _Tp>
         requires __tag_invocable_r<const _VTable*, __create_vtable_t,
                                    __mtype<_VTable>, __mtype<_Tp>>
-    constexpr const _VTable* operator()(__mtype<_VTable>,
-                                        __mtype<_Tp>) const noexcept
+    constexpr auto operator()(__mtype<_VTable>, __mtype<_Tp>) const noexcept
+        -> const _VTable*
     {
         return stdexec::tag_invoke(__create_vtable_t{}, __mtype<_VTable>{},
                                    __mtype<_Tp>{});
@@ -53,9 +53,9 @@
 {
     _Ret (*__fn_)(void*, _As...);
 
-    _Ret operator()(_Tag, void* __rcvr, _As&&... __as) const
+    auto operator()(_Tag, void* __rcvr, _As&&... __as) const -> _Ret
     {
-        return __fn_(__rcvr, (_As&&)__as...);
+        return __fn_(__rcvr, static_cast<_As&&>(__as)...);
     }
 };
 
@@ -64,9 +64,9 @@
 {
     _Ret (*__fn_)(void*, _As...);
 
-    _Ret operator()(_Tag, void* __rcvr, _As&&... __as) const
+    auto operator()(_Tag, void* __rcvr, _As&&... __as) const -> _Ret
     {
-        return __fn_(__rcvr, (_As&&)__as...);
+        return __fn_(__rcvr, static_cast<_As&&>(__as)...);
     }
 };
 
@@ -75,9 +75,9 @@
 {
     _Ret (*__fn_)(void*, _As...) noexcept;
 
-    _Ret operator()(_Tag, void* __rcvr, _As&&... __as) const noexcept
+    auto operator()(_Tag, void* __rcvr, _As&&... __as) const noexcept -> _Ret
     {
-        return __fn_(__rcvr, (_As&&)__as...);
+        return __fn_(__rcvr, static_cast<_As&&>(__as)...);
     }
 };
 
@@ -86,9 +86,9 @@
 {
     _Ret (*__fn_)(void*, _As...) noexcept;
 
-    _Ret operator()(_Tag, void* __rcvr, _As&&... __as) const noexcept
+    auto operator()(_Tag, void* __rcvr, _As&&... __as) const noexcept -> _Ret
     {
-        return __fn_(__rcvr, (_As&&)__as...);
+        return __fn_(__rcvr, static_cast<_As&&>(__as)...);
     }
 };
 
@@ -105,8 +105,9 @@
                         const noexcept)(void*, _As...)
     {
         return +[](void* __env_provider, _As... __as) -> _Ret {
-            return _Tag{}(get_env(*(const _EnvProvider*)__env_provider),
-                          (_As&&)__as...);
+            return _Tag{}(
+                get_env(*static_cast<const _EnvProvider*>(__env_provider)),
+                static_cast<_As&&>(__as)...);
         };
     }
 
@@ -119,8 +120,9 @@
             static_assert(
                 __nothrow_callable<_Tag, const env_of_t<_EnvProvider>&,
                                    _As...>);
-            return _Tag{}(get_env(*(const _EnvProvider*)__env_provider),
-                          (_As&&)__as...);
+            return _Tag{}(
+                get_env(*static_cast<const _EnvProvider*>(__env_provider)),
+                static_cast<_As&&>(__as)...);
         };
     }
 };
@@ -135,7 +137,8 @@
                         const noexcept)(void*, _As...)
     {
         return +[](void* __queryable, _As... __as) -> _Ret {
-            return _Tag{}(*(const _Queryable*)__queryable, (_As&&)__as...);
+            return _Tag{}(*static_cast<const _Queryable*>(__queryable),
+                          static_cast<_As&&>(__as)...);
         };
     }
 
@@ -146,7 +149,8 @@
     {
         return +[](void* __env_provider, _As... __as) noexcept -> _Ret {
             static_assert(__nothrow_callable<_Tag, const _Queryable&, _As...>);
-            return _Tag{}(*(const _Queryable*)__env_provider, (_As&&)__as...);
+            return _Tag{}(*static_cast<const _Queryable*>(__env_provider),
+                          static_cast<_As&&>(__as)...);
         };
     }
 };
@@ -161,7 +165,7 @@
 
     void operator()(_Tag, void* __storage, _As&&... __as) const
     {
-        return __fn_(__storage, (_As&&)__as...);
+        return __fn_(__storage, static_cast<_As&&>(__as)...);
     }
 };
 
@@ -172,7 +176,7 @@
 
     void operator()(_Tag, void* __storage, _As&&... __as) const noexcept
     {
-        return __fn_(__storage, (_As&&)__as...);
+        return __fn_(__storage, static_cast<_As&&>(__as)...);
     }
 };
 
@@ -185,8 +189,8 @@
                         const noexcept)(void*, _As...)
     {
         return +[](void* __storage, _As... __as) -> void {
-            return _Tag{}(__mtype<_Tp>{}, *(_Storage*)__storage,
-                          (_As&&)__as...);
+            return _Tag{}(__mtype<_Tp>{}, *static_cast<_Storage*>(__storage),
+                          static_cast<_As&&>(__as)...);
         };
     }
 
@@ -198,8 +202,8 @@
         return +[](void* __storage, _As... __as) noexcept -> void {
             static_assert(
                 __nothrow_callable<_Tag, __mtype<_Tp>, _Storage&, _As...>);
-            return _Tag{}(__mtype<_Tp>{}, *(_Storage*)__storage,
-                          (_As&&)__as...);
+            return _Tag{}(__mtype<_Tp>{}, *static_cast<_Storage*>(__storage),
+                          static_cast<_As&&>(__as)...);
         };
     }
 };
@@ -248,7 +252,7 @@
         static_assert(nothrow_tag_invocable<__move_construct_t, __mtype<_Tp>,
                                             _Storage&, _Storage&&>);
         stdexec::tag_invoke(__move_construct_t{}, __mtype<_Tp>{}, __self,
-                            (_Storage&&)__from);
+                            static_cast<_Storage&&>(__from));
     }
 };
 
@@ -281,9 +285,9 @@
     __null_storage_vtbl{};
 
 template <class _ParentVTable, class... _StorageCPOs>
-constexpr const __storage_vtable<_ParentVTable, _StorageCPOs...>*
-    __default_storage_vtable(
-        __storage_vtable<_ParentVTable, _StorageCPOs...>*) noexcept
+constexpr auto __default_storage_vtable(
+    __storage_vtable<_ParentVTable, _StorageCPOs...>*) noexcept
+    -> const __storage_vtable<_ParentVTable, _StorageCPOs...>*
 {
     return &__null_storage_vtbl<_ParentVTable, _StorageCPOs...>;
 }
@@ -291,7 +295,8 @@
 template <class _Storage, class _Tp, class _ParentVTable, class... _StorageCPOs>
 static const __storage_vtable<_ParentVTable, _StorageCPOs...> __storage_vtbl{
     {*__create_vtable(__mtype<_ParentVTable>{}, __mtype<_Tp>{})},
-    {__storage_vfun_fn<_Storage, _Tp>{}((_StorageCPOs*)nullptr)}...};
+    {__storage_vfun_fn<_Storage, _Tp>{}(
+        static_cast<_StorageCPOs*>(nullptr))}...};
 
 template <class _Vtable, class _Allocator, bool _Copyable = false,
           std::size_t _Alignment = alignof(std::max_align_t),
@@ -320,7 +325,8 @@
                                            alignof(_Tp) <= __alignment;
 
         template <class _Tp>
-        static constexpr const __vtable_t* __get_vtable_of_type() noexcept
+        static constexpr auto __get_vtable_of_type() noexcept
+            -> const __vtable_t*
         {
             return &__storage_vtbl<__t, __decay_t<_Tp>, _Vtable, __with_delete>;
         }
@@ -338,11 +344,11 @@
             using _Dp = __decay_t<_Tp>;
             if constexpr (__is_small<_Dp>)
             {
-                __construct_small<_Dp>((_Tp&&)__object);
+                __construct_small<_Dp>(static_cast<_Tp&&>(__object));
             }
             else
             {
-                __construct_large<_Dp>((_Tp&&)__object);
+                __construct_large<_Dp>(static_cast<_Tp&&>(__object));
             }
         }
 
@@ -354,11 +360,11 @@
         {
             if constexpr (__is_small<_Tp>)
             {
-                __construct_small<_Tp>((_Args&&)__args...);
+                __construct_small<_Tp>(static_cast<_Args&&>(__args)...);
             }
             else
             {
-                __construct_large<_Tp>((_Args&&)__args...);
+                __construct_large<_Tp>(static_cast<_Args&&>(__args)...);
             }
         }
 
@@ -371,15 +377,16 @@
         {
             (*__vtable_)(__delete, this);
             __object_pointer_ = nullptr;
-            __vtable_ = __default_storage_vtable((__vtable_t*)nullptr);
+            __vtable_ =
+                __default_storage_vtable(static_cast<__vtable_t*>(nullptr));
         }
 
-        const _Vtable* __get_vtable() const noexcept
+        [[nodiscard]] auto __get_vtable() const noexcept -> const _Vtable*
         {
             return __vtable_;
         }
 
-        void* __get_object_pointer() const noexcept
+        [[nodiscard]] auto __get_object_pointer() const noexcept -> void*
         {
             return __object_pointer_;
         }
@@ -395,8 +402,8 @@
             using _Alloc = typename std::allocator_traits<
                 _Allocator>::template rebind_alloc<_Tp>;
             _Alloc __alloc{__allocator_};
-            std::allocator_traits<_Alloc>::construct(__alloc, __pointer,
-                                                     (_As&&)__args...);
+            std::allocator_traits<_Alloc>::construct(
+                __alloc, __pointer, static_cast<_As&&>(__args)...);
             __object_pointer_ = __pointer;
         }
 
@@ -410,8 +417,8 @@
                                                                      1);
             try
             {
-                std::allocator_traits<_Alloc>::construct(__alloc, __pointer,
-                                                         (_As&&)__args...);
+                std::allocator_traits<_Alloc>::construct(
+                    __alloc, __pointer, static_cast<_As&&>(__args)...);
             }
             catch (...)
             {
@@ -444,10 +451,11 @@
 
       private:
         const __vtable_t* __vtable_{
-            __default_storage_vtable((__vtable_t*)nullptr)};
+            __default_storage_vtable(static_cast<__vtable_t*>(nullptr))};
         void* __object_pointer_{nullptr};
         alignas(__alignment) std::byte __buffer_[__buffer_size]{};
-        STDEXEC_ATTRIBUTE((no_unique_address)) _Allocator __allocator_{};
+        STDEXEC_ATTRIBUTE((no_unique_address))
+        _Allocator __allocator_{};
     };
 };
 
@@ -478,7 +486,7 @@
         __storage_vtable<_Vtable, __with_delete, __with_move>>;
 
     template <class _Tp>
-    static constexpr const __vtable_t* __get_vtable_of_type() noexcept
+    static constexpr auto __get_vtable_of_type() noexcept -> const __vtable_t*
     {
         if constexpr (_Copyable)
         {
@@ -505,11 +513,11 @@
         using _Dp = __decay_t<_Tp>;
         if constexpr (__is_small<_Dp>)
         {
-            __construct_small<_Dp>((_Tp&&)__object);
+            __construct_small<_Dp>(static_cast<_Tp&&>(__object));
         }
         else
         {
-            __construct_large<_Dp>((_Tp&&)__object);
+            __construct_large<_Dp>(static_cast<_Tp&&>(__object));
         }
     }
 
@@ -520,11 +528,11 @@
     {
         if constexpr (__is_small<_Tp>)
         {
-            __construct_small<_Tp>((_Args&&)__args...);
+            __construct_small<_Tp>(static_cast<_Args&&>(__args)...);
         }
         else
         {
-            __construct_large<_Tp>((_Args&&)__args...);
+            __construct_large<_Tp>(static_cast<_Args&&>(__args)...);
         }
     }
 
@@ -534,22 +542,28 @@
         (*__other.__vtable_)(__copy_construct, this, __other);
     }
 
-    __t& operator=(const __t& __other)
+    auto operator=(const __t& __other) -> __t&
         requires(_Copyable)
     {
-        __t tmp(__other);
-        return *this = std::move(tmp);
+        if (&__other != this)
+        {
+            __t tmp(__other);
+            *this = std::move(tmp);
+        }
+        return *this;
     }
 
     __t(__t&& __other) noexcept
     {
-        (*__other.__vtable_)(__move_construct, this, (__t&&)__other);
+        (*__other.__vtable_)(__move_construct, this,
+                             static_cast<__t&&>(__other));
     }
 
-    __t& operator=(__t&& __other) noexcept
+    auto operator=(__t&& __other) noexcept -> __t&
     {
         __reset();
-        (*__other.__vtable_)(__move_construct, this, (__t&&)__other);
+        (*__other.__vtable_)(__move_construct, this,
+                             static_cast<__t&&>(__other));
         return *this;
     }
 
@@ -562,15 +576,15 @@
     {
         (*__vtable_)(__delete, this);
         __object_pointer_ = nullptr;
-        __vtable_ = __default_storage_vtable((__vtable_t*)nullptr);
+        __vtable_ = __default_storage_vtable(static_cast<__vtable_t*>(nullptr));
     }
 
-    const _Vtable* __get_vtable() const noexcept
+    auto __get_vtable() const noexcept -> const _Vtable*
     {
         return __vtable_;
     }
 
-    void* __get_object_pointer() const noexcept
+    [[nodiscard]] auto __get_object_pointer() const noexcept -> void*
     {
         return __object_pointer_;
     }
@@ -586,7 +600,7 @@
             _Allocator>::template rebind_alloc<_Tp>;
         _Alloc __alloc{__allocator_};
         std::allocator_traits<_Alloc>::construct(__alloc, __pointer,
-                                                 (_As&&)__args...);
+                                                 static_cast<_As&&>(__args)...);
         __object_pointer_ = __pointer;
     }
 
@@ -599,8 +613,8 @@
         _Tp* __pointer = std::allocator_traits<_Alloc>::allocate(__alloc, 1);
         try
         {
-            std::allocator_traits<_Alloc>::construct(__alloc, __pointer,
-                                                     (_As&&)__args...);
+            std::allocator_traits<_Alloc>::construct(
+                __alloc, __pointer, static_cast<_As&&>(__args)...);
         }
         catch (...)
         {
@@ -642,7 +656,8 @@
         if constexpr (__is_small<_Tp>)
         {
             _Tp& __other_object = *__pointer;
-            __self.template __construct_small<_Tp>((_Tp&&)__other_object);
+            __self.template __construct_small<_Tp>(
+                static_cast<_Tp&&>(__other_object));
             using _Alloc = typename std::allocator_traits<
                 _Allocator>::template rebind_alloc<_Tp>;
             _Alloc __alloc{__self.__allocator_};
@@ -653,7 +668,8 @@
             __self.__object_pointer_ = __pointer;
         }
         __self.__vtable_ = std::exchange(
-            __other.__vtable_, __default_storage_vtable((__vtable_t*)nullptr));
+            __other.__vtable_,
+            __default_storage_vtable(static_cast<__vtable_t*>(nullptr)));
     }
 
     template <class _Tp>
@@ -678,18 +694,19 @@
         __self.__vtable_ = __other.__vtable_;
     }
 
-    const __vtable_t* __vtable_{__default_storage_vtable((__vtable_t*)nullptr)};
+    const __vtable_t* __vtable_{
+        __default_storage_vtable(static_cast<__vtable_t*>(nullptr))};
     void* __object_pointer_{nullptr};
     alignas(__alignment) std::byte __buffer_[__buffer_size]{};
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Allocator __allocator_{};
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Allocator __allocator_{};
 };
 
 struct __empty_vtable
 {
     template <class _Sender>
-    friend const __empty_vtable* tag_invoke(__create_vtable_t,
-                                            __mtype<__empty_vtable>,
-                                            __mtype<_Sender>) noexcept
+    friend auto tag_invoke(__create_vtable_t, __mtype<__empty_vtable>,
+                           __mtype<_Sender>) noexcept -> const __empty_vtable*
     {
         static const __empty_vtable __vtable_{};
         return &__vtable_;
@@ -707,10 +724,10 @@
 using __copyable_storage_t = __t<__storage<_VTable, _Allocator, true>>;
 
 template <class _Tag, class... _As>
-_Tag __tag_type(_Tag (*)(_As...));
+auto __tag_type(_Tag (*)(_As...)) -> _Tag;
 
 template <class _Tag, class... _As>
-_Tag __tag_type(_Tag (*)(_As...) noexcept);
+auto __tag_type(_Tag (*)(_As...) noexcept) -> _Tag;
 
 template <class _Query>
 concept __is_stop_token_query = requires {
@@ -753,7 +770,8 @@
                         const noexcept)(void*, _As...) noexcept
     {
         return +[](void* __rcvr, _As... __as) noexcept -> void {
-            _Tag{}((_Rcvr&&)*(_Rcvr*)__rcvr, (_As&&)__as...);
+            _Tag{}(static_cast<_Rcvr&&>(*static_cast<_Rcvr*>(__rcvr)),
+                   static_cast<_As&&>(__as)...);
         };
     }
 };
@@ -770,12 +788,12 @@
         template <class _Rcvr>
             requires receiver_of<_Rcvr, completion_signatures<_Sigs...>> &&
                      (__callable<__query_vfun_fn<_Rcvr>, _Queries> && ...)
-        friend const __t* tag_invoke(__create_vtable_t, __mtype<__t>,
-                                     __mtype<_Rcvr>) noexcept
+        friend auto tag_invoke(__create_vtable_t, __mtype<__t>,
+                               __mtype<_Rcvr>) noexcept -> const __t*
         {
             static const __t __vtable_{
-                {__rcvr_vfun_fn<_Rcvr>{}((_Sigs*)nullptr)}...,
-                {__query_vfun_fn<_Rcvr>{}((_Queries) nullptr)}...};
+                {__rcvr_vfun_fn<_Rcvr>{}(static_cast<_Sigs*>(nullptr))}...,
+                {__query_vfun_fn<_Rcvr>{}(static_cast<_Queries>(nullptr))}...};
             return &__vtable_;
         }
     };
@@ -807,11 +825,12 @@
                 __nothrow_callable<const __vtable_t&, _Tag, void*, _As...>)
                 -> __call_result_t<const __vtable_t&, _Tag, void*, _As...>
         {
-            return (*__self.__vtable_)(_Tag{}, __self.__rcvr_, (_As&&)__as...);
+            return (*__self.__vtable_)(_Tag{}, __self.__rcvr_,
+                                       static_cast<_As&&>(__as)...);
         }
 
-        friend in_place_stop_token tag_invoke(get_stop_token_t,
-                                              const __env_t& __self) noexcept
+        friend auto tag_invoke(get_stop_token_t, const __env_t& __self) noexcept
+            -> in_place_stop_token
         {
             return __self.__token_;
         }
@@ -835,24 +854,27 @@
     friend void tag_invoke(_Tag, _Self&& __self, _As&&... __as) noexcept
     {
         (*static_cast<const __rcvr_vfun<_Tag(_As...)>*>(__self.__env_.__vtable_)
-              ->__fn_)(((_Self&&)__self).__env_.__rcvr_, (_As&&)__as...);
+              ->__fn_)(static_cast<_Self&&>(__self).__env_.__rcvr_,
+                       static_cast<_As&&>(__as)...);
     }
 
     template <std::same_as<__ref> Self>
-    friend const __env_t& tag_invoke(get_env_t, const Self& __self) noexcept
+    friend auto tag_invoke(get_env_t, const Self& __self) noexcept
+        -> const __env_t&
     {
         return __self.__env_;
     }
 };
 
-__mbool<true> __test_never_stop_token(
-    get_stop_token_t (*)(never_stop_token (*)() noexcept));
+auto __test_never_stop_token(
+    get_stop_token_t (*)(never_stop_token (*)() noexcept)) -> __mbool<true>;
 
 template <class _Tag, class _Ret, class... _As>
-__mbool<false> __test_never_stop_token(_Tag (*)(_Ret (*)(_As...) noexcept));
+auto __test_never_stop_token(_Tag (*)(_Ret (*)(_As...) noexcept))
+    -> __mbool<false>;
 
 template <class _Tag, class _Ret, class... _As>
-__mbool<false> __test_never_stop_token(_Tag (*)(_Ret (*)(_As...)));
+auto __test_never_stop_token(_Tag (*)(_Ret (*)(_As...))) -> __mbool<false>;
 
 template <class _Query>
 using __is_never_stop_token_query =
@@ -886,7 +908,8 @@
                 __nothrow_callable<const __vtable_t&, _Tag, void*, _As...>)
                 -> __call_result_t<const __vtable_t&, _Tag, void*, _As...>
         {
-            return (*__self.__vtable_)(_Tag{}, __self.__rcvr_, (_As&&)__as...);
+            return (*__self.__vtable_)(_Tag{}, __self.__rcvr_,
+                                       static_cast<_As&&>(__as)...);
         }
     } __env_;
 
@@ -908,11 +931,13 @@
     friend void tag_invoke(_Tag, _Self&& __self, _As&&... __as) noexcept
     {
         (*static_cast<const __rcvr_vfun<_Tag(_As...)>*>(__self.__env_.__vtable_)
-              ->__fn_)(((_Self&&)__self).__env_.__rcvr_, (_As&&)__as...);
+              ->__fn_)(static_cast<_Self&&>(__self).__env_.__rcvr_,
+                       static_cast<_As&&>(__as)...);
     }
 
     template <std::same_as<__ref> Self>
-    friend const __env_t& tag_invoke(get_env_t, const Self& __self) noexcept
+    friend auto tag_invoke(get_env_t, const Self& __self) noexcept
+        -> const __env_t&
     {
         return __self.__env_;
     }
@@ -926,9 +951,8 @@
 
   private:
     template <class _Op>
-    friend const __operation_vtable* tag_invoke(__create_vtable_t,
-                                                __mtype<__operation_vtable>,
-                                                __mtype<_Op>) noexcept
+    friend auto tag_invoke(__create_vtable_t, __mtype<__operation_vtable>,
+                           __mtype<_Op>) noexcept -> const __operation_vtable*
     {
         static __operation_vtable __vtable{
             [](void* __object_pointer) noexcept -> void {
@@ -960,7 +984,8 @@
 template <class _Receiver>
 struct __operation_base
 {
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Receiver __rcvr_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Receiver __rcvr_;
     stdexec::in_place_stop_source __stop_source_{};
     using __stop_callback = typename stdexec::stop_token_of_t<
         stdexec::env_of_t<_Receiver>>::template callback_type<__on_stop_t>;
@@ -1020,8 +1045,8 @@
         }
 
         template <same_as<get_env_t> _GetEnv, same_as<__t> _Self>
-        friend __env_t<env_of_t<_Receiver>>
-            tag_invoke(_GetEnv, const _Self& __self) noexcept
+        friend auto tag_invoke(_GetEnv, const _Self& __self) noexcept
+            -> __env_t<env_of_t<_Receiver>>
         {
             return __env::__join(
                 __env::__with(__self.__op_->__stop_source_.get_token(),
@@ -1083,7 +1108,8 @@
         {}
 
       private:
-        STDEXEC_ATTRIBUTE((no_unique_address)) _Receiver __rec_;
+        STDEXEC_ATTRIBUTE((no_unique_address))
+        _Receiver __rec_;
         __immovable_operation_storage __storage_{};
 
         friend void tag_invoke(start_t, __t& __self) noexcept
@@ -1107,12 +1133,12 @@
   private:
     template <class _EnvProvider>
         requires(__callable<__query_vfun_fn<_EnvProvider>, _Queries> && ...)
-    friend const __query_vtable* tag_invoke(__create_vtable_t,
-                                            __mtype<__query_vtable>,
-                                            __mtype<_EnvProvider>) noexcept
+    friend auto tag_invoke(__create_vtable_t, __mtype<__query_vtable>,
+                           __mtype<_EnvProvider>) noexcept
+        -> const __query_vtable*
     {
-        static const __query_vtable __vtable{
-            {__query_vfun_fn<_EnvProvider>{}((_Queries) nullptr)}...};
+        static const __query_vtable __vtable{{__query_vfun_fn<_EnvProvider>{}(
+            static_cast<_Queries>(nullptr))}...};
         return &__vtable;
     }
 };
@@ -1131,7 +1157,7 @@
       public:
         using __id = __vtable;
 
-        const __query_vtable<_SenderQueries>& __queries() const noexcept
+        auto __queries() const noexcept -> const __query_vtable<_SenderQueries>&
         {
             return *this;
         }
@@ -1140,8 +1166,8 @@
 
       private:
         template <sender_to<__receiver_ref_t> _Sender>
-        friend const __vtable* tag_invoke(__create_vtable_t, __mtype<__vtable>,
-                                          __mtype<_Sender>) noexcept
+        friend auto tag_invoke(__create_vtable_t, __mtype<__vtable>,
+                               __mtype<_Sender>) noexcept -> const __vtable*
         {
             static const __vtable __vtable_{
                 {*__create_vtable(__mtype<__query_vtable<_SenderQueries>>{},
@@ -1153,8 +1179,9 @@
                     connect_result_t<_Sender, __receiver_ref_t>;
                 return __immovable_operation_storage{
                     std::in_place_type<__op_state_t>, __conv{[&] {
-                    return stdexec::connect((_Sender&&)__sender,
-                                            (__receiver_ref_t&&)__receiver);
+                    return stdexec::connect(
+                        static_cast<_Sender&&>(__sender),
+                        static_cast<__receiver_ref_t&&>(__receiver));
                 }}};
             }};
             return &__vtable_;
@@ -1183,7 +1210,7 @@
                                    void*, _As...>
         {
             return __self.__vtable_->__queries()(_Tag{}, __self.__sender_,
-                                                 (_As&&)__as...);
+                                                 static_cast<_As&&>(__as)...);
         }
     };
 
@@ -1195,21 +1222,22 @@
         using sender_concept = stdexec::sender_t;
 
         __t(const __t&) = delete;
-        __t& operator=(const __t&) = delete;
+        auto operator=(const __t&) -> __t& = delete;
 
         __t(__t&&) = default;
-        __t& operator=(__t&&) = default;
+        auto operator=(__t&&) -> __t& = default;
 
         template <__not_decays_to<__t> _Sender>
             requires sender_to<_Sender, __receiver_ref<_Sigs, _ReceiverQueries>>
-        __t(_Sender&& __sndr) : __storage_{(_Sender&&)__sndr}
+        __t(_Sender&& __sndr) : __storage_{static_cast<_Sender&&>(__sndr)}
         {}
 
-        __immovable_operation_storage __connect(__receiver_ref_t __receiver)
+        auto __connect(__receiver_ref_t __receiver)
+            -> __immovable_operation_storage
         {
             return __storage_.__get_vtable()->__connect_(
                 __storage_.__get_object_pointer(),
-                (__receiver_ref_t&&)__receiver);
+                static_cast<__receiver_ref_t&&>(__receiver));
         }
 
         explicit operator bool() const noexcept
@@ -1221,14 +1249,14 @@
         __unique_storage_t<__vtable> __storage_;
 
         template <receiver_of<_Sigs> _Rcvr>
-        friend stdexec::__t<__operation<stdexec::__id<__decay_t<_Rcvr>>,
+        friend auto tag_invoke(connect_t, __t&& __self, _Rcvr&& __rcvr)
+            -> stdexec::__t<__operation<stdexec::__id<__decay_t<_Rcvr>>,
                                         __with_in_place_stop_token>>
-            tag_invoke(connect_t, __t&& __self, _Rcvr&& __rcvr)
         {
-            return {(__t&&)__self, (_Rcvr&&)__rcvr};
+            return {static_cast<__t&&>(__self), static_cast<_Rcvr&&>(__rcvr)};
         }
 
-        friend __env_t tag_invoke(get_env_t, const __t& __self) noexcept
+        friend auto tag_invoke(get_env_t, const __t& __self) noexcept -> __env_t
         {
             return {__self.__storage_.__get_vtable(),
                     __self.__storage_.__get_object_pointer()};
@@ -1243,7 +1271,7 @@
     template <class _Scheduler>
         requires(!__decays_to<_Scheduler, __scheduler>) && scheduler<_Scheduler>
     __scheduler(_Scheduler&& __scheduler) :
-        __storage_{(_Scheduler&&)__scheduler}
+        __storage_{static_cast<_Scheduler&&>(__scheduler)}
     {}
 
     using __sender_t = _ScheduleSender;
@@ -1255,15 +1283,16 @@
         __sender_t (*__schedule_)(void*) noexcept;
         bool (*__equal_to_)(const void*, const void* other) noexcept;
 
-        const __query_vtable<_SchedulerQueries>& __queries() const noexcept
+        auto __queries() const noexcept
+            -> const __query_vtable<_SchedulerQueries>&
         {
             return *this;
         }
 
       private:
         template <scheduler _Scheduler>
-        friend const __vtable* tag_invoke(__create_vtable_t, __mtype<__vtable>,
-                                          __mtype<_Scheduler>) noexcept
+        friend auto tag_invoke(__create_vtable_t, __mtype<__vtable>,
+                               __mtype<_Scheduler>) noexcept -> const __vtable*
         {
             static const __vtable __vtable_{
                 {*__create_vtable(__mtype<__query_vtable<_SchedulerQueries>>{},
@@ -1288,7 +1317,8 @@
     };
 
     template <same_as<__scheduler> _Self>
-    friend __sender_t tag_invoke(schedule_t, const _Self& __self) noexcept
+    friend auto tag_invoke(schedule_t, const _Self& __self) noexcept
+        -> __sender_t
     {
         STDEXEC_ASSERT(__self.__storage_.__get_vtable()->__schedule_);
         return __self.__storage_.__get_vtable()->__schedule_(
@@ -1305,11 +1335,12 @@
                            void*, _As...>
     {
         return __self.__storage_.__get_vtable()->__queries()(
-            _Tag{}, __self.__storage_.__get_object_pointer(), (_As&&)__as...);
+            _Tag{}, __self.__storage_.__get_object_pointer(),
+            static_cast<_As&&>(__as)...);
     }
 
-    friend bool operator==(const __scheduler& __self,
-                           const __scheduler& __other) noexcept
+    friend auto operator==(const __scheduler& __self,
+                           const __scheduler& __other) noexcept -> bool
     {
         if (__self.__storage_.__get_vtable() !=
             __other.__storage_.__get_vtable())
@@ -1326,8 +1357,8 @@
                || (!__p && !__o);
     }
 
-    friend bool operator!=(const __scheduler& __self,
-                           const __scheduler& __other) noexcept
+    friend auto operator!=(const __scheduler& __self,
+                           const __scheduler& __other) noexcept -> bool
     {
         return !(__self == __other);
     }
@@ -1355,8 +1386,9 @@
         std::is_nothrow_invocable_v<
             _Tag, stdexec::__copy_cvref_t<Self, __receiver_base>, _As...>)
     {
-        return stdexec::tag_invoke(_Tag{}, ((Self&&)__self).__receiver_,
-                                   (_As&&)__as...);
+        return stdexec::tag_invoke(_Tag{},
+                                   static_cast<Self&&>(__self).__receiver_,
+                                   static_cast<_As&&>(__as)...);
     }
 
   public:
@@ -1389,8 +1421,9 @@
             std::is_nothrow_invocable_v<
                 _Tag, stdexec::__copy_cvref_t<Self, __sender_base>, _As...>)
         {
-            return stdexec::tag_invoke(_Tag{}, ((Self&&)__self).__sender_,
-                                       (_As&&)__as...);
+            return stdexec::tag_invoke(_Tag{},
+                                       static_cast<Self&&>(__self).__sender_,
+                                       static_cast<_As&&>(__as)...);
         }
 
       public:
@@ -1402,7 +1435,7 @@
             requires stdexec::sender_to<_Sender, __receiver_base>
         any_sender(_Sender&& __sender) noexcept(
             stdexec::__nothrow_constructible_from<__sender_base, _Sender>) :
-            __sender_((_Sender&&)__sender)
+            __sender_(static_cast<_Sender&&>(__sender))
         {}
 
         template <auto... _SchedulerQueries>
@@ -1416,14 +1449,14 @@
                 any_receiver_ref<__schedule_completions, _ReceiverQueries...>;
 
             template <typename _Tag, typename _Sig>
-            static _Tag __ret_fn(_Tag (*const)(_Sig));
+            static auto __ret_fn(_Tag (*const)(_Sig)) -> _Tag;
 
             template <class _Tag>
             struct __ret_equals_to
             {
                 template <class _Sig>
-                using __f =
-                    std::is_same<_Tag, decltype(__ret_fn((_Sig) nullptr))>;
+                using __f = std::is_same<
+                    _Tag, decltype(__ret_fn(static_cast<_Sig>(nullptr)))>;
             };
 
             using schedule_sender_queries = stdexec::__minvoke<
@@ -1464,7 +1497,7 @@
                 requires(!stdexec::__decays_to<_Scheduler, any_scheduler> &&
                          stdexec::scheduler<_Scheduler>)
             any_scheduler(_Scheduler&& __scheduler) :
-                __scheduler_{(_Scheduler&&)__scheduler}
+                __scheduler_{static_cast<_Scheduler&&>(__scheduler)}
             {}
 
           private:
@@ -1479,12 +1512,13 @@
                     _As...>)
             {
                 return stdexec::tag_invoke(
-                    _Tag{}, ((Self&&)__self).__scheduler_, (_As&&)__as...);
+                    _Tag{}, static_cast<Self&&>(__self).__scheduler_,
+                    static_cast<_As&&>(__as)...);
             }
 
-            friend bool
-                operator==(const any_scheduler& __self,
-                           const any_scheduler& __other) noexcept = default;
+            friend auto operator==(const any_scheduler& __self,
+                                   const any_scheduler& __other) noexcept
+                -> bool = default;
         };
     };
 };
diff --git a/include/sdbusplus/async/stdexec/async_scope.hpp b/include/sdbusplus/async/stdexec/async_scope.hpp
index 524f11c..63f38d6 100644
--- a/include/sdbusplus/async/stdexec/async_scope.hpp
+++ b/include/sdbusplus/async/stdexec/async_scope.hpp
@@ -74,7 +74,8 @@
         explicit __t(const __impl* __scope, _Constrained&& __sndr,
                      _Receiver __rcvr) :
             __task{{}, __scope, __notify_waiter},
-            __op_(stdexec::connect((_Constrained&&)__sndr, (_Receiver&&)__rcvr))
+            __op_(stdexec::connect(static_cast<_Constrained&&>(__sndr),
+                                   static_cast<_Receiver&&>(__rcvr)))
         {}
 
       private:
@@ -124,11 +125,13 @@
 
         template <__decays_to<__t> _Self, receiver _Receiver>
             requires sender_to<__copy_cvref_t<_Self, _Constrained>, _Receiver>
-        [[nodiscard]] friend __when_empty_op_t<_Self, _Receiver>
-            tag_invoke(connect_t, _Self&& __self, _Receiver __rcvr)
+        [[nodiscard]] friend auto tag_invoke(connect_t, _Self&& __self,
+                                             _Receiver __rcvr)
+            -> __when_empty_op_t<_Self, _Receiver>
         {
             return __when_empty_op_t<_Self, _Receiver>{
-                __self.__scope_, ((_Self&&)__self).__c_, (_Receiver&&)__rcvr};
+                __self.__scope_, static_cast<_Self&&>(__self).__c_,
+                static_cast<_Receiver&&>(__rcvr)};
         }
 
         template <__decays_to<__t> _Self, class _Env>
@@ -139,13 +142,14 @@
             return {};
         }
 
-        friend empty_env tag_invoke(get_env_t, const __t&) noexcept
+        friend auto tag_invoke(get_env_t, const __t&) noexcept -> empty_env
         {
             return {};
         }
 
         const __impl* __scope_;
-        STDEXEC_ATTRIBUTE((no_unique_address)) _Constrained __c_;
+        STDEXEC_ATTRIBUTE((no_unique_address))
+        _Constrained __c_;
     };
 };
 
@@ -160,7 +164,8 @@
 {
     using _Receiver = stdexec::__t<_ReceiverId>;
     const __impl* __scope_;
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Receiver __rcvr_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Receiver __rcvr_;
 };
 
 template <class _ReceiverId>
@@ -198,14 +203,15 @@
         friend void tag_invoke(_Tag, __t&& __self, _As&&... __as) noexcept
         {
             auto __scope = __self.__op_->__scope_;
-            _Tag{}(std::move(__self.__op_->__rcvr_), (_As&&)__as...);
+            _Tag{}(std::move(__self.__op_->__rcvr_),
+                   static_cast<_As&&>(__as)...);
             // do not access __op_
             // do not access this
             __complete(__scope);
         }
 
-        friend __env_t<env_of_t<_Receiver>>
-            tag_invoke(get_env_t, const __t& __self) noexcept
+        friend auto tag_invoke(get_env_t, const __t& __self) noexcept
+            -> __env_t<env_of_t<_Receiver>>
         {
             return make_env(
                 get_env(__self.__op_->__rcvr_),
@@ -231,8 +237,10 @@
         template <__decays_to<_Constrained> _Sender,
                   __decays_to<_Receiver> _Rcvr>
         explicit __t(const __impl* __scope, _Sender&& __c, _Rcvr&& __rcvr) :
-            __nest_op_base<_ReceiverId>{{}, __scope, (_Rcvr&&)__rcvr},
-            __op_(stdexec::connect((_Sender&&)__c, __nest_rcvr_t{this}))
+            __nest_op_base<_ReceiverId>{
+                {}, __scope, static_cast<_Rcvr&&>(__rcvr)},
+            __op_(stdexec::connect(static_cast<_Sender&&>(__c),
+                                   __nest_rcvr_t{this}))
         {}
 
       private:
@@ -264,7 +272,8 @@
         using sender_concept = stdexec::sender_t;
 
         const __impl* __scope_;
-        STDEXEC_ATTRIBUTE((no_unique_address)) _Constrained __c_;
+        STDEXEC_ATTRIBUTE((no_unique_address))
+        _Constrained __c_;
 
         template <class _Receiver>
         using __nest_operation_t =
@@ -276,11 +285,13 @@
         template <__decays_to<__t> _Self, receiver _Receiver>
             requires sender_to<__copy_cvref_t<_Self, _Constrained>,
                                __nest_receiver_t<_Receiver>>
-        [[nodiscard]] friend __nest_operation_t<_Receiver>
-            tag_invoke(connect_t, _Self&& __self, _Receiver __rcvr)
+        [[nodiscard]] friend auto tag_invoke(connect_t, _Self&& __self,
+                                             _Receiver __rcvr)
+            -> __nest_operation_t<_Receiver>
         {
             return __nest_operation_t<_Receiver>{
-                __self.__scope_, ((_Self&&)__self).__c_, (_Receiver&&)__rcvr};
+                __self.__scope_, static_cast<_Self&&>(__self).__c_,
+                static_cast<_Receiver&&>(__rcvr)};
         }
 
         template <__decays_to<__t> _Self, class _Env>
@@ -291,7 +302,7 @@
             return {};
         }
 
-        friend empty_env tag_invoke(get_env_t, const __t&) noexcept
+        friend auto tag_invoke(get_env_t, const __t&) noexcept -> empty_env
         {
             return {};
         }
@@ -373,7 +384,7 @@
                 else if (get_stop_token(get_env(__rcvr_)).stop_requested())
                 {
                     __guard.unlock();
-                    set_stopped((_Receiver&&)__rcvr_);
+                    set_stopped(static_cast<_Receiver&&>(__rcvr_));
                     __guard.lock();
                 }
                 else
@@ -390,7 +401,8 @@
                                 [this, &__guard]<class... _As>(auto tag,
                                                                _As&... __as) {
                                 __guard.unlock();
-                                tag((_Receiver&&)__rcvr_, (_As&&)__as...);
+                                tag(static_cast<_Receiver&&>(__rcvr_),
+                                    static_cast<_As&&>(__as)...);
                                 __guard.lock();
                             },
                                 __tup);
@@ -401,7 +413,8 @@
             }
             catch (...)
             {
-                set_error((_Receiver&&)__rcvr_, std::current_exception());
+                set_error(static_cast<_Receiver&&>(__rcvr_),
+                          std::current_exception());
             }
         }
 
@@ -425,11 +438,13 @@
             }
             catch (...)
             {
-                set_error((_Receiver&&)__rcvr_, std::current_exception());
+                set_error(static_cast<_Receiver&&>(__rcvr_),
+                          std::current_exception());
             }
         }
 
-        STDEXEC_ATTRIBUTE((no_unique_address)) _Receiver __rcvr_;
+        STDEXEC_ATTRIBUTE((no_unique_address))
+        _Receiver __rcvr_;
         std::unique_ptr<__future_state<_Sender, _Env>> __state_;
         STDEXEC_ATTRIBUTE((no_unique_address))
         __forward_consumer __forward_consumer_;
@@ -462,7 +477,8 @@
                            [](__subscription* __self) noexcept -> void {
             static_cast<__t*>(__self)->__complete_();
         }},
-            __rcvr_((_Receiver2&&)__rcvr), __state_(std::move(__state)),
+            __rcvr_(static_cast<_Receiver2&&>(__rcvr)),
+            __state_(std::move(__state)),
             __forward_consumer_(get_stop_token(get_env(__rcvr_)),
                                 __forward_stopped{&__state_->__stop_source_})
         {}
@@ -484,10 +500,10 @@
 #else
 
 template <class _Tag, class... _Ts>
-std::tuple<_Tag, _Ts...> __completion_as_tuple_(_Tag (*)(_Ts&&...));
+auto __completion_as_tuple_(_Tag (*)(_Ts&&...)) -> std::tuple<_Tag, _Ts...>;
 template <class _Fn>
 using __completion_as_tuple_t =
-    decltype(__scope::__completion_as_tuple_((_Fn*)nullptr));
+    decltype(__scope::__completion_as_tuple_(static_cast<_Fn*>(nullptr)));
 #endif
 
 template <class... _Ts>
@@ -524,7 +540,7 @@
 
     template <class _Uy>
         requires convertible_to<_Uy*, _Ty*>
-    __dynamic_delete& operator=(std::default_delete<_Uy> __d)
+    auto operator=(std::default_delete<_Uy> __d) -> __dynamic_delete&
     {
         __delete_ = __dynamic_delete{__d}.__delete_;
         return *this;
@@ -545,7 +561,7 @@
         __forward_scope_{std::in_place, __scope->__stop_source_.get_token(),
                          __forward_stopped{&__stop_source_}},
         __env_(
-            make_env((_Env&&)__env,
+            make_env(static_cast<_Env&&>(__env),
                      with(get_stop_token, __scope->__stop_source_.get_token())))
     {}
 
@@ -630,8 +646,8 @@
             {
                 std::unique_lock __guard{__state.__mutex_};
                 using _Tuple = __decayed_tuple<_Tag, _As...>;
-                __state.__data_.template emplace<_Tuple>(_Tag{},
-                                                         (_As&&)__as...);
+                __state.__data_.template emplace<_Tuple>(
+                    _Tag{}, static_cast<_As&&>(__as)...);
                 __guard.unlock();
                 __self.__dispatch_result_();
             }
@@ -643,8 +659,8 @@
             }
         }
 
-        friend const __env_t<_Env>& tag_invoke(get_env_t,
-                                               const __t& __self) noexcept
+        friend auto tag_invoke(get_env_t, const __t& __self) noexcept
+            -> const __env_t<_Env>&
         {
             return __self.__state_->__env_;
         }
@@ -662,9 +678,10 @@
     using _Completions = __future_completions_t<_Sender, _Env>;
 
     __future_state(_Sender __sndr, _Env __env, const __impl* __scope) :
-        __future_state_base<_Completions, _Env>((_Env&&)__env, __scope),
+        __future_state_base<_Completions, _Env>(static_cast<_Env&&>(__env),
+                                                __scope),
         __op_(
-            stdexec::connect((_Sender&&)__sndr,
+            stdexec::connect(static_cast<_Sender&&>(__sndr),
                              __future_receiver_t<_Sender, _Env>{this, __scope}))
     {}
 
@@ -683,7 +700,7 @@
         using sender_concept = stdexec::sender_t;
 
         __t(__t&&) = default;
-        __t& operator=(__t&&) = default;
+        auto operator=(__t&&) -> __t& = default;
 
         ~__t() noexcept
         {
@@ -724,10 +741,10 @@
 
         template <__decays_to<__t> _Self, receiver _Receiver>
             requires receiver_of<_Receiver, __completions_t<_Self>>
-        friend __future_op_t<_Receiver> tag_invoke(connect_t, _Self&& __self,
-                                                   _Receiver __rcvr)
+        friend auto tag_invoke(connect_t, _Self&& __self, _Receiver __rcvr)
+            -> __future_op_t<_Receiver>
         {
-            return __future_op_t<_Receiver>{(_Receiver&&)__rcvr,
+            return __future_op_t<_Receiver>{static_cast<_Receiver&&>(__rcvr),
                                             std::move(__self.__state_)};
         }
 
@@ -738,7 +755,7 @@
             return {};
         }
 
-        friend empty_env tag_invoke(get_env_t, const __t&) noexcept
+        friend auto tag_invoke(get_env_t, const __t&) noexcept -> empty_env
         {
             return {};
         }
@@ -791,8 +808,8 @@
             std::rethrow_exception(std::move(__eptr));
         }
 
-        friend const __spawn_env_t<_Env>& tag_invoke(get_env_t,
-                                                     const __t& __self) noexcept
+        friend auto tag_invoke(get_env_t, const __t& __self) noexcept
+            -> const __spawn_env_t<_Env>&
         {
             return __self.__op_->__env_;
         }
@@ -814,14 +831,14 @@
         __t(_Sndr&& __sndr, _Env __env, const __impl* __scope) :
             __spawn_op_base<_EnvId>{
                 __env::__join(
-                    (_Env&&)__env,
+                    static_cast<_Env&&>(__env),
                     __env::__with(__scope->__stop_source_.get_token(),
                                   get_stop_token),
                     __env::__with(__inln::__scheduler{}, get_scheduler)),
                 [](__spawn_op_base<_EnvId>* __op) {
             delete static_cast<__t*>(__op);
         }},
-            __op_(stdexec::connect((_Sndr&&)__sndr,
+            __op_(stdexec::connect(static_cast<_Sndr&&>(__sndr),
                                    __spawn_receiver_t<_Env>{this}))
         {}
 
@@ -849,11 +866,11 @@
     async_scope() = default;
 
     template <sender _Constrained>
-    [[nodiscard]] __when_empty_sender_t<_Constrained>
-        when_empty(_Constrained&& __c) const
+    [[nodiscard]] auto when_empty(_Constrained&& __c) const
+        -> __when_empty_sender_t<_Constrained>
     {
-        return __when_empty_sender_t<_Constrained>{&__impl_,
-                                                   (_Constrained&&)__c};
+        return __when_empty_sender_t<_Constrained>{
+            &__impl_, static_cast<_Constrained&&>(__c)};
     }
 
     [[nodiscard]] auto on_empty() const
@@ -865,9 +882,10 @@
     using nest_result_t = __nest_sender_t<_Constrained>;
 
     template <sender _Constrained>
-    [[nodiscard]] nest_result_t<_Constrained> nest(_Constrained&& __c)
+    [[nodiscard]] auto nest(_Constrained&& __c) -> nest_result_t<_Constrained>
     {
-        return nest_result_t<_Constrained>{&__impl_, (_Constrained&&)__c};
+        return nest_result_t<_Constrained>{&__impl_,
+                                           static_cast<_Constrained&&>(__c)};
     }
 
     template <__movable_value _Env = empty_env,
@@ -879,32 +897,34 @@
         // start is noexcept so we can assume that the operation will complete
         // after this, which means we can rely on its self-ownership to ensure
         // that it is eventually deleted
-        stdexec::start(
-            *new __op_t{nest((_Sender&&)__sndr), (_Env&&)__env, &__impl_});
+        stdexec::start(*new __op_t{nest(static_cast<_Sender&&>(__sndr)),
+                                   static_cast<_Env&&>(__env), &__impl_});
     }
 
     template <__movable_value _Env = empty_env,
               sender_in<__env_t<_Env>> _Sender>
-    __future_t<_Sender, _Env> spawn_future(_Sender&& __sndr, _Env __env = {})
+    auto spawn_future(_Sender&& __sndr, _Env __env = {})
+        -> __future_t<_Sender, _Env>
     {
         using __state_t = __future_state<nest_result_t<_Sender>, _Env>;
-        auto __state = std::make_unique<__state_t>(nest((_Sender&&)__sndr),
-                                                   (_Env&&)__env, &__impl_);
+        auto __state =
+            std::make_unique<__state_t>(nest(static_cast<_Sender&&>(__sndr)),
+                                        static_cast<_Env&&>(__env), &__impl_);
         stdexec::start(__state->__op_);
         return __future_t<_Sender, _Env>{std::move(__state)};
     }
 
-    in_place_stop_source& get_stop_source() noexcept
+    auto get_stop_source() noexcept -> in_place_stop_source&
     {
         return __impl_.__stop_source_;
     }
 
-    in_place_stop_token get_stop_token() const noexcept
+    auto get_stop_token() const noexcept -> in_place_stop_token
     {
         return __impl_.__stop_source_.get_token();
     }
 
-    bool request_stop() noexcept
+    auto request_stop() noexcept -> bool
     {
         return __impl_.__stop_source_.request_stop();
     }
diff --git a/include/sdbusplus/async/stdexec/at_coroutine_exit.hpp b/include/sdbusplus/async/stdexec/at_coroutine_exit.hpp
index f299244..6bb5318 100644
--- a/include/sdbusplus/async/stdexec/at_coroutine_exit.hpp
+++ b/include/sdbusplus/async/stdexec/at_coroutine_exit.hpp
@@ -54,7 +54,8 @@
             friend void tag_invoke(_Tag, _Self&& __self,
                                    _Args&&... __args) noexcept
             {
-                _Tag{}((_Receiver&&)__self.__receiver_, (_Args&&)__args...);
+                _Tag{}(static_cast<_Receiver&&>(__self.__receiver_),
+                       static_cast<_Args&&>(__args)...);
             }
 
             template <same_as<set_stopped_t> _Tag>
@@ -63,8 +64,8 @@
                 std::terminate();
             }
 
-            friend env_of_t<_Receiver> tag_invoke(get_env_t,
-                                                  const __t& __self) noexcept
+            friend auto tag_invoke(get_env_t, const __t& __self) noexcept
+                -> env_of_t<_Receiver>
             {
                 return get_env(__self.__receiver_);
             }
@@ -90,12 +91,13 @@
 
             template <receiver _Receiver>
                 requires sender_to<_Sender, __receiver<_Receiver>>
-            friend connect_result_t<_Sender, __receiver<_Receiver>>
-                tag_invoke(connect_t, __t&& __self, _Receiver&& __rcvr) noexcept
+            friend auto tag_invoke(connect_t, __t&& __self,
+                                   _Receiver&& __rcvr) noexcept
+                -> connect_result_t<_Sender, __receiver<_Receiver>>
             {
                 return stdexec::connect(
-                    (_Sender&&)__self.__sender_,
-                    __receiver<_Receiver>{(_Receiver&&)__rcvr});
+                    static_cast<_Sender&&>(__self.__sender_),
+                    __receiver<_Receiver>{static_cast<_Receiver&&>(__rcvr)});
             }
 
             template <__decays_to<__t> _Self, class _Env>
@@ -105,8 +107,8 @@
                 return {};
             }
 
-            friend env_of_t<_Sender> tag_invoke(get_env_t,
-                                                const __t& __self) noexcept
+            friend auto tag_invoke(get_env_t, const __t& __self) noexcept
+                -> env_of_t<_Sender>
             {
                 return get_env(__self.__sender_);
             }
@@ -116,16 +118,16 @@
     using __sender = __t<__sender_id<__decay_t<_Sender>>>;
 
     template <sender _Sender>
-    __sender<_Sender> operator()(_Sender&& __sndr) const
-        noexcept(__nothrow_decay_copyable<_Sender>)
+    auto operator()(_Sender&& __sndr) const
+        noexcept(__nothrow_decay_copyable<_Sender>) -> __sender<_Sender>
     {
-        return __sender<_Sender>{(_Sender&&)__sndr};
+        return __sender<_Sender>{static_cast<_Sender&&>(__sndr)};
     }
 
     template <class _Value>
-    _Value&& operator()(_Value&& __value) const noexcept
+    auto operator()(_Value&& __value) const noexcept -> _Value&&
     {
-        return (_Value&&)__value;
+        return static_cast<_Value&&>(__value);
     }
 };
 
@@ -158,13 +160,14 @@
         __coro_(std::exchange(__that.__coro_, {}))
     {}
 
-    bool await_ready() const noexcept
+    [[nodiscard]] auto await_ready() const noexcept -> bool
     {
         return false;
     }
 
     template <__has_continuation _Promise>
-    bool await_suspend(__coro::coroutine_handle<_Promise> __parent) noexcept
+    auto await_suspend(__coro::coroutine_handle<_Promise> __parent) noexcept
+        -> bool
     {
         __coro_.promise().__scheduler_ =
             get_scheduler(get_env(__parent.promise()));
@@ -173,7 +176,7 @@
         return false;
     }
 
-    std::tuple<_Ts&...> await_resume() noexcept
+    auto await_resume() noexcept -> std::tuple<_Ts&...>
     {
         return std::exchange(__coro_, {}).promise().__args_;
     }
@@ -181,13 +184,14 @@
   private:
     struct __final_awaitable
     {
-        static constexpr bool await_ready() noexcept
+        static constexpr auto await_ready() noexcept -> bool
         {
             return false;
         }
 
-        static __coro::coroutine_handle<>
+        static auto
             await_suspend(__coro::coroutine_handle<__promise> __h) noexcept
+            -> __coro::coroutine_handle<>
         {
             __promise& __p = __h.promise();
             auto __coro = __p.__is_unhandled_stopped_
@@ -203,8 +207,8 @@
     {
         const __promise& __promise_;
 
-        friend __any_scheduler tag_invoke(get_scheduler_t,
-                                          __env __self) noexcept
+        friend auto tag_invoke(get_scheduler_t, __env __self) noexcept
+            -> __any_scheduler
         {
             return __self.__promise_.__scheduler_;
         }
@@ -216,12 +220,12 @@
         explicit __promise(_Action&&, _Ts&... __ts) noexcept : __args_{__ts...}
         {}
 
-        __coro::suspend_always initial_suspend() noexcept
+        auto initial_suspend() noexcept -> __coro::suspend_always
         {
             return {};
         }
 
-        __final_awaitable final_suspend() noexcept
+        auto final_suspend() noexcept -> __final_awaitable
         {
             return {};
         }
@@ -233,26 +237,28 @@
             std::terminate();
         }
 
-        __coro::coroutine_handle<__promise> unhandled_stopped() noexcept
+        auto unhandled_stopped() noexcept -> __coro::coroutine_handle<__promise>
         {
             __is_unhandled_stopped_ = true;
             return __coro::coroutine_handle<__promise>::from_promise(*this);
         }
 
-        __task get_return_object() noexcept
+        auto get_return_object() noexcept -> __task
         {
             return __task(
                 __coro::coroutine_handle<__promise>::from_promise(*this));
         }
 
         template <class _Awaitable>
-        decltype(auto) await_transform(_Awaitable&& __awaitable) noexcept
+        auto await_transform(_Awaitable&& __awaitable) noexcept
+            -> decltype(auto)
         {
-            return as_awaitable(__die_on_stop((_Awaitable&&)__awaitable),
-                                *this);
+            return as_awaitable(
+                __die_on_stop(static_cast<_Awaitable&&>(__awaitable)), *this);
         }
 
-        friend __env tag_invoke(get_env_t, const __promise& __self) noexcept
+        friend auto tag_invoke(get_env_t, const __promise& __self) noexcept
+            -> __env
         {
             return {__self};
         }
@@ -269,17 +275,18 @@
 {
   private:
     template <class _Action, class... _Ts>
-    static __task<_Ts...> __impl(_Action __action, _Ts... __ts)
+    static auto __impl(_Action __action, _Ts... __ts) -> __task<_Ts...>
     {
-        co_await ((_Action&&)__action)((_Ts&&)__ts...);
+        co_await static_cast<_Action&&>(__action)(static_cast<_Ts&&>(__ts)...);
     }
 
   public:
     template <class _Action, class... _Ts>
         requires __callable<__decay_t<_Action>, __decay_t<_Ts>...>
-    __task<_Ts...> operator()(_Action&& __action, _Ts&&... __ts) const
+    auto operator()(_Action&& __action, _Ts&&... __ts) const -> __task<_Ts...>
     {
-        return __impl((_Action&&)__action, (_Ts&&)__ts...);
+        return __impl(static_cast<_Action&&>(__action),
+                      static_cast<_Ts&&>(__ts)...);
     }
 };
 } // namespace __at_coro_exit
diff --git a/include/sdbusplus/async/stdexec/commit.info b/include/sdbusplus/async/stdexec/commit.info
index 0e54be9..68da718 100644
--- a/include/sdbusplus/async/stdexec/commit.info
+++ b/include/sdbusplus/async/stdexec/commit.info
@@ -1 +1 @@
-2c19548b9e38f54ef7b8d8d4e49920afe43b9ede
+af0efa96811682e26c123175746c408fa582dbb1
diff --git a/include/sdbusplus/async/stdexec/concepts.hpp b/include/sdbusplus/async/stdexec/concepts.hpp
index 79a9740..5963932 100644
--- a/include/sdbusplus/async/stdexec/concepts.hpp
+++ b/include/sdbusplus/async/stdexec/concepts.hpp
@@ -94,7 +94,7 @@
 inline constexpr bool __destructible_ = //
     requires {
         {
-            ((_Ty && (*)() noexcept) nullptr)().~_Ty()
+            (static_cast < _Ty && (*)() noexcept > (nullptr))().~_Ty()
         } noexcept;
     };
 template <class _Ty>
@@ -143,7 +143,7 @@
     //   const std::remove_reference_t<_RHS>&> &&
     requires(_LHS __lhs, _RHS&& __rhs) {
         {
-            __lhs = ((_RHS&&)__rhs)
+            __lhs = static_cast<_RHS&&>(__rhs)
         } -> same_as<_LHS>;
     };
 
@@ -154,13 +154,13 @@
 template <class _Ty, class _Uy>
 concept swappable_with =             //
     requires(_Ty&& __t, _Uy&& __u) { //
-        swap((_Ty&&)__t, (_Uy&&)__u);
+        swap(static_cast<_Ty&&>(__t), static_cast<_Uy&&>(__u));
     };
 
 inline constexpr const auto __fn = //
     []<class _Ty, swappable_with<_Ty> _Uy>(_Ty&& __t, _Uy&& __u) noexcept(
-        noexcept(swap((_Ty&&)__t, (_Uy&&)__u))) {
-    swap((_Ty&&)__t, (_Uy&&)__u);
+        noexcept(swap(static_cast<_Ty&&>(__t), static_cast<_Uy&&>(__u)))) {
+    swap(static_cast<_Ty&&>(__t), static_cast<_Uy&&>(__u));
 };
 } // namespace __swap
 
@@ -244,7 +244,7 @@
     __movable_value<_Ty> &&       //
     requires(_Ty&& __t) {
         {
-            __decay_t<_Ty>{__decay_t<_Ty>{(_Ty&&)__t}}
+            __decay_t<_Ty>{__decay_t<_Ty>{static_cast<_Ty&&>(__t)}}
         } noexcept;
     };
 
diff --git a/include/sdbusplus/async/stdexec/coroutine.hpp b/include/sdbusplus/async/stdexec/coroutine.hpp
index b5f9645..01fb2fc 100644
--- a/include/sdbusplus/async/stdexec/coroutine.hpp
+++ b/include/sdbusplus/async/stdexec/coroutine.hpp
@@ -62,61 +62,78 @@
 
 template <class _Awaitable>
 void __co_await_constraint(_Awaitable&& __awaitable)
-    requires requires { operator co_await((_Awaitable&&)__awaitable); };
+    requires requires {
+                 operator co_await(static_cast<_Awaitable&&>(__awaitable));
+             };
 #endif
 
 template <class _Awaitable>
-decltype(auto) __get_awaiter(_Awaitable&& __awaitable, void*)
-{
-    if constexpr (requires { ((_Awaitable&&)__awaitable).operator co_await(); })
-    {
-        return ((_Awaitable&&)__awaitable).operator co_await();
-    }
-    else if constexpr (requires {
-#if STDEXEC_MSVC()
-                           __co_await_constraint((_Awaitable&&)__awaitable);
-#else
-        operator co_await((_Awaitable&&) __awaitable);
-#endif
-                       })
-    {
-        return operator co_await((_Awaitable&&)__awaitable);
-    }
-    else
-    {
-        return (_Awaitable&&)__awaitable;
-    }
-}
-
-template <class _Awaitable, class _Promise>
-decltype(auto) __get_awaiter(_Awaitable&& __awaitable, _Promise* __promise)
-    requires requires { __promise->await_transform((_Awaitable&&)__awaitable); }
+auto __get_awaiter(_Awaitable&& __awaitable, void*) -> decltype(auto)
 {
     if constexpr (requires {
-                      __promise->await_transform((_Awaitable&&)__awaitable)
+                      static_cast<_Awaitable&&>(__awaitable)
                           .
                           operator co_await();
                   })
     {
-        return __promise->await_transform((_Awaitable&&)__awaitable)
+        return static_cast<_Awaitable&&>(__awaitable).operator co_await();
+    }
+    else if constexpr (requires {
+#if STDEXEC_MSVC()
+                           __co_await_constraint(
+                               static_cast<_Awaitable&&>(__awaitable));
+#else
+                           operator co_await(
+                               static_cast<_Awaitable&&>(__awaitable));
+#endif
+                       })
+    {
+        return operator co_await(static_cast<_Awaitable&&>(__awaitable));
+    }
+    else
+    {
+        return static_cast<_Awaitable&&>(__awaitable);
+    }
+}
+
+template <class _Awaitable, class _Promise>
+auto __get_awaiter(_Awaitable&& __awaitable, _Promise* __promise)
+    -> decltype(auto)
+    requires requires {
+                 __promise->await_transform(
+                     static_cast<_Awaitable&&>(__awaitable));
+             }
+{
+    if constexpr (requires {
+                      __promise
+                          ->await_transform(
+                              static_cast<_Awaitable&&>(__awaitable))
+                          .
+                          operator co_await();
+                  })
+    {
+        return __promise
+            ->await_transform(static_cast<_Awaitable&&>(__awaitable))
             .
             operator co_await();
     }
     else if constexpr (requires {
 #if STDEXEC_MSVC()
                            __co_await_constraint(__promise->await_transform(
-                               (_Awaitable&&)__awaitable));
+                               static_cast<_Awaitable&&>(__awaitable)));
 #else
-        operator co_await(__promise->await_transform((_Awaitable&&) __awaitable));
+                           operator co_await(__promise->await_transform(
+                               static_cast<_Awaitable&&>(__awaitable)));
 #endif
                        })
     {
         return operator co_await(
-            __promise->await_transform((_Awaitable&&)__awaitable));
+            __promise->await_transform(static_cast<_Awaitable&&>(__awaitable)));
     }
     else
     {
-        return __promise->await_transform((_Awaitable&&)__awaitable);
+        return __promise->await_transform(
+            static_cast<_Awaitable&&>(__awaitable));
     }
 }
 
@@ -124,19 +141,20 @@
 concept __awaitable = //
     requires(_Awaitable&& __awaitable, _Promise* __promise) {
         {
-            stdexec::__get_awaiter((_Awaitable&&)__awaitable, __promise)
+            stdexec::__get_awaiter(static_cast<_Awaitable&&>(__awaitable),
+                                   __promise)
         } -> __awaiter<_Promise>;
     };
 
 template <class _Tp>
-_Tp& __as_lvalue(_Tp&&);
+auto __as_lvalue(_Tp&&) -> _Tp&;
 
 template <class _Awaitable, class _Promise = void>
     requires __awaitable<_Awaitable, _Promise>
 using __await_result_t =
     decltype(stdexec::__as_lvalue(
                  stdexec::__get_awaiter(std::declval<_Awaitable>(),
-                                        (_Promise*)nullptr))
+                                        static_cast<_Promise*>(nullptr)))
                  .await_resume());
 
 #else
diff --git a/include/sdbusplus/async/stdexec/env.hpp b/include/sdbusplus/async/stdexec/env.hpp
index 4df755c..d83948a 100644
--- a/include/sdbusplus/async/stdexec/env.hpp
+++ b/include/sdbusplus/async/stdexec/env.hpp
@@ -32,16 +32,16 @@
     template <class _Tag, class _Value>
     auto operator()(_Tag, _Value&& __val) const
     {
-        return stdexec::__env::__with((_Value&&)__val, _Tag());
+        return stdexec::__env::__with(static_cast<_Value&&>(__val), _Tag());
     }
 };
 
 struct __without_t
 {
     template <class _Env, class _Tag>
-    decltype(auto) operator()(_Env&& __env, _Tag) const
+    auto operator()(_Env&& __env, _Tag) const -> decltype(auto)
     {
-        return stdexec::__env::__without((_Env&&)__env, _Tag());
+        return stdexec::__env::__without(static_cast<_Env&&>(__env), _Tag());
     }
 };
 
@@ -54,13 +54,14 @@
     auto operator()(_Base&& __base, _Env&& __env) const noexcept
         -> stdexec::__env::__join_t<_Env, _Base>
     {
-        return stdexec::__env::__join((_Env&&)__env, (_Base&&)__base);
+        return stdexec::__env::__join(static_cast<_Env&&>(__env),
+                                      static_cast<_Base&&>(__base));
     }
 
     template <stdexec::__nothrow_move_constructible _Env>
-    _Env operator()(_Env&& __env) const noexcept
+    auto operator()(_Env&& __env) const noexcept -> _Env
     {
-        return (_Env&&)__env;
+        return static_cast<_Env&&>(__env);
     }
 };
 } // namespace __envs
@@ -88,7 +89,8 @@
     {
         using __id = __operation;
 
-        STDEXEC_ATTRIBUTE((no_unique_address)) _Default __default_;
+        STDEXEC_ATTRIBUTE((no_unique_address))
+        _Default __default_;
         _Receiver __rcvr_;
 
         friend void tag_invoke(start_t, __t& __self) noexcept
@@ -123,7 +125,8 @@
     using __id = __sender;
     using __t = __sender;
     using sender_concept = stdexec::sender_t;
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Default __default_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Default __default_;
 
     template <class _Env>
     using __value_t = __minvoke<
@@ -141,7 +144,9 @@
         noexcept(std::is_nothrow_move_constructible_v<_Receiver>)
             -> __operation_t<_Tag, __default_t<env_of_t<_Receiver>>, _Receiver>
     {
-        return {{}, ((_Self&&)__self).__default_, (_Receiver&&)__rcvr};
+        return {{},
+                static_cast<_Self&&>(__self).__default_,
+                static_cast<_Receiver&&>(__rcvr)};
     }
 
     template <class _Env>
@@ -158,7 +163,7 @@
     constexpr auto operator()(_Tag, _Default&& __default) const
         -> __sender<_Tag, __decay_t<_Default>>
     {
-        return {(_Default&&)__default};
+        return {static_cast<_Default&&>(__default)};
     }
 };
 } // namespace __read_with_default
diff --git a/include/sdbusplus/async/stdexec/execution.hpp b/include/sdbusplus/async/stdexec/execution.hpp
index 36c5013..8286020 100644
--- a/include/sdbusplus/async/stdexec/execution.hpp
+++ b/include/sdbusplus/async/stdexec/execution.hpp
@@ -80,12 +80,12 @@
 
     template <class _Receiver, class... _As>
         requires tag_invocable<set_value_t, _Receiver, _As...>
-    STDEXEC_ATTRIBUTE((host, device, always_inline)) //
-        void
+    STDEXEC_ATTRIBUTE((host, device, always_inline)) void
         operator()(_Receiver&& __rcvr, _As&&... __as) const noexcept
     {
         static_assert(nothrow_tag_invocable<set_value_t, _Receiver, _As...>);
-        (void)tag_invoke(set_value_t{}, (_Receiver&&)__rcvr, (_As&&)__as...);
+        (void)tag_invoke(set_value_t{}, static_cast<_Receiver&&>(__rcvr),
+                         static_cast<_As&&>(__as)...);
     }
 };
 
@@ -97,12 +97,12 @@
 
     template <class _Receiver, class _Error>
         requires tag_invocable<set_error_t, _Receiver, _Error>
-    STDEXEC_ATTRIBUTE((host, device, always_inline)) //
-        void
+    STDEXEC_ATTRIBUTE((host, device, always_inline)) void
         operator()(_Receiver&& __rcvr, _Error&& __err) const noexcept
     {
         static_assert(nothrow_tag_invocable<set_error_t, _Receiver, _Error>);
-        (void)tag_invoke(set_error_t{}, (_Receiver&&)__rcvr, (_Error&&)__err);
+        (void)tag_invoke(set_error_t{}, static_cast<_Receiver&&>(__rcvr),
+                         static_cast<_Error&&>(__err));
     }
 };
 
@@ -114,12 +114,11 @@
 
     template <class _Receiver>
         requires tag_invocable<set_stopped_t, _Receiver>
-    STDEXEC_ATTRIBUTE((host, device, always_inline)) //
-        void
+    STDEXEC_ATTRIBUTE((host, device, always_inline)) void
         operator()(_Receiver&& __rcvr) const noexcept
     {
         static_assert(nothrow_tag_invocable<set_stopped_t, _Receiver>);
-        (void)tag_invoke(set_stopped_t{}, (_Receiver&&)__rcvr);
+        (void)tag_invoke(set_stopped_t{}, static_cast<_Receiver&&>(__rcvr));
     }
 };
 } // namespace __receivers
@@ -140,17 +139,18 @@
     {
         if constexpr (__nothrow_callable<_Fun, _Args...>)
         {
-            ((_Fun&&)__fun)((_Args&&)__args...);
+            static_cast<_Fun&&>(__fun)(static_cast<_Args&&>(__args)...);
         }
         else
         {
             try
             {
-                ((_Fun&&)__fun)((_Args&&)__args...);
+                static_cast<_Fun&&>(__fun)(static_cast<_Args&&>(__args)...);
             }
             catch (...)
             {
-                set_error((_Receiver&&)__rcvr, std::current_exception());
+                set_error(static_cast<_Receiver&&>(__rcvr),
+                          std::current_exception());
             }
         }
     }
@@ -200,18 +200,6 @@
 // completion_signatures
 namespace __compl_sigs
 {
-#if STDEXEC_NVHPC()
-template <class _Ty = __q<__types>, class... _Args>
-__types<__minvoke<_Ty, _Args...>> __test(set_value_t (*)(_Args...),
-                                         set_value_t = {}, _Ty = {});
-template <class _Ty = __q<__types>, class _Error>
-__types<__minvoke<_Ty, _Error>> __test(set_error_t (*)(_Error),
-                                       set_error_t = {}, _Ty = {});
-template <class _Ty = __q<__types>>
-__types<__minvoke<_Ty>> __test(set_stopped_t (*)(), set_stopped_t = {},
-                               _Ty = {});
-__types<> __test(__ignore, __ignore, __ignore = {});
-
 template <class _Sig>
 inline constexpr bool __is_compl_sig = false;
 template <class... _Args>
@@ -220,58 +208,24 @@
 inline constexpr bool __is_compl_sig<set_error_t(_Error)> = true;
 template <>
 inline constexpr bool __is_compl_sig<set_stopped_t()> = true;
+} // namespace __compl_sigs
 
-#else
-
-template <same_as<set_value_t> _Tag, class _Ty = __q<__types>, class... _Args>
-__types<__minvoke<_Ty, _Args...>> __test(_Tag (*)(_Args...));
-template <same_as<set_error_t> _Tag, class _Ty = __q<__types>, class _Error>
-__types<__minvoke<_Ty, _Error>> __test(_Tag (*)(_Error));
-template <same_as<set_stopped_t> _Tag, class _Ty = __q<__types>>
-__types<__minvoke<_Ty>> __test(_Tag (*)());
-template <class, class = void>
-__types<> __test(...);
-template <class _Tag, class _Ty = void, class... _Args>
-void __test(_Tag (*)(_Args...) noexcept) = delete;
-#endif
-
-#if STDEXEC_NVHPC()
 template <class _Sig>
 concept __completion_signature = __compl_sigs::__is_compl_sig<_Sig>;
 
-template <class _Sig, class _Tag, class _Ty = __q<__types>>
-using __signal_args_t =
-    decltype(__compl_sigs::__test((_Sig*)nullptr, _Tag{}, _Ty{}));
-#else
-template <class _Sig>
-concept __completion_signature =
-    __typename<decltype(__compl_sigs::__test((_Sig*)nullptr))>;
-
-template <class _Sig, class _Tag, class _Ty = __q<__types>>
-using __signal_args_t =
-    decltype(__compl_sigs::__test<_Tag, _Ty>((_Sig*)nullptr));
-#endif
-} // namespace __compl_sigs
-
-using __compl_sigs::__completion_signature;
-
-template <__compl_sigs::__completion_signature... _Sigs>
+template <__completion_signature... _Sigs>
 struct completion_signatures
-{
-    // Uncomment this to see where completion_signatures is
-    // erroneously getting instantiated:
-    // static_assert(sizeof...(_Sigs) == -1u);
-};
+{};
 
 namespace __compl_sigs
 {
-template <class _TaggedTuple, __completion_tag _Tag, class... _Ts>
+template <class _TaggedTuple, class _Tag, class... _Ts>
 auto __as_tagged_tuple_(_Tag (*)(_Ts...), _TaggedTuple*)
     -> __mconst<__minvoke<_TaggedTuple, _Tag, _Ts...>>;
 
 template <class _Sig, class _TaggedTuple>
 using __as_tagged_tuple = decltype(__compl_sigs::__as_tagged_tuple_(
-    (_Sig*)nullptr, (_TaggedTuple*)nullptr));
+    static_cast<_Sig*>(nullptr), static_cast<_TaggedTuple*>(nullptr)));
 
 template <class _TaggedTuple, class _Variant, class... _Sigs>
 auto __for_all_sigs_(completion_signatures<_Sigs...>*, _TaggedTuple*, _Variant*)
@@ -282,8 +236,9 @@
 using __for_all_sigs =                          //
     __minvoke<                                  //
         decltype(__compl_sigs::__for_all_sigs_( //
-            (_Completions*)nullptr, (_TaggedTuple*)nullptr,
-            (_Variant*)nullptr))>;
+            static_cast<_Completions*>(nullptr),
+            static_cast<_TaggedTuple*>(nullptr),
+            static_cast<_Variant*>(nullptr)))>;
 
 template <class _Completions, class _TaggedTuple, class _Variant>
 using __maybe_for_all_sigs =
@@ -337,12 +292,12 @@
 
 template <class _Receiver, class _Tag, class... _Args>
     requires nothrow_tag_invocable<_Tag, _Receiver, _Args...>
-__msuccess __try_completion(_Tag (*)(_Args...));
+auto __try_completion(_Tag (*)(_Args...)) -> __msuccess;
 
 template <class _Receiver, class... _Sigs>
-auto __try_completions(completion_signatures<_Sigs...>*)
-    -> decltype((__msuccess(), ...,
-                 stdexec::__try_completion<_Receiver>((_Sigs*)nullptr)));
+auto __try_completions(completion_signatures<_Sigs...>*) -> decltype((
+    __msuccess(), ...,
+    stdexec::__try_completion<_Receiver>(static_cast<_Sigs*>(nullptr))));
 
 template <class _Sender, class _Env>
 using __unrecognized_sender_error = //
@@ -354,6 +309,14 @@
     __call_result_t<get_completion_signatures_t, _Sender, _Env>;
 
 /////////////////////////////////////////////////////////////////////////////
+// early sender type-checking
+template <class _Sender>
+concept __well_formed_sender = //
+    !__detail::__non_dependent_sender<_Sender> ||
+    __valid_completion_signatures<
+        __completion_signatures_of_t<_Sender, empty_env>>;
+
+/////////////////////////////////////////////////////////////////////////////
 // [execution.receivers]
 struct receiver_t
 {
@@ -401,8 +364,8 @@
 {
 struct __is_debug_env_t
 {
-    friend constexpr bool tag_invoke(forwarding_query_t,
-                                     const __is_debug_env_t&) noexcept
+    friend constexpr auto tag_invoke(forwarding_query_t,
+                                     const __is_debug_env_t&) noexcept -> bool
     {
         return true;
     }
@@ -482,7 +445,8 @@
 
     template <same_as<get_env_t> _Tag>
     STDEXEC_ATTRIBUTE((host, device))
-    friend __debug_env_t<_Env> tag_invoke(_Tag, __debug_receiver) noexcept
+    friend auto tag_invoke(_Tag, __debug_receiver) noexcept
+        -> __debug_env_t<_Env>
     {
         STDEXEC_TERMINATE();
     }
@@ -605,7 +569,8 @@
             // static_assert(receiver_of<_Receiver, _Sigs>);
             if constexpr (!same_as<_Operation, __debug_operation>)
             {
-                auto __op = connect((_Sender&&)__sndr, _Receiver{});
+                auto __op = connect(static_cast<_Sender&&>(__sndr),
+                                    _Receiver{});
                 start(__op);
             }
         }
@@ -629,7 +594,8 @@
                 // static_assert(receiver_of<_Receiver, _Sigs>);
                 if constexpr (!same_as<_Operation, __debug_operation>)
                 {
-                    auto __op = connect((_Sender&&)__sndr, _Receiver{});
+                    auto __op = connect(static_cast<_Sender&&>(__sndr),
+                                        _Receiver{});
                     start(__op);
                 }
             }
@@ -659,17 +625,19 @@
 {
     template <class _Domain, class _Sender, class _Env>
     STDEXEC_ATTRIBUTE((always_inline))
-    /*constexpr*/ decltype(auto) operator()(_Domain __dom, _Sender&& __sndr,
-                                            _Env&& __env) const noexcept
+    /*constexpr*/
+    decltype(auto) operator()(_Domain __dom, _Sender&& __sndr,
+                              _Env&& __env) const noexcept
     {
         if constexpr (__domain::__has_transform_env<_Domain, _Sender, _Env>)
         {
-            return __dom.transform_env((_Sender&&)__sndr, (_Env&&)__env);
+            return __dom.transform_env(static_cast<_Sender&&>(__sndr),
+                                       static_cast<_Env&&>(__env));
         }
         else
         {
-            return default_domain().transform_env((_Sender&&)__sndr,
-                                                  (_Env&&)__env);
+            return default_domain().transform_env(
+                static_cast<_Sender&&>(__sndr), static_cast<_Env&&>(__env));
         }
     }
 };
@@ -678,18 +646,20 @@
 {
     template <class _Domain, class _Sender, class... _Env>
     STDEXEC_ATTRIBUTE((always_inline))
-    /*constexpr*/ decltype(auto) operator()(_Domain __dom, _Sender&& __sndr,
-                                            const _Env&... __env) const
+    /*constexpr*/
+    decltype(auto) operator()(_Domain __dom, _Sender&& __sndr,
+                              const _Env&... __env) const
     {
         if constexpr (__domain::__has_transform_sender<_Domain, _Sender,
                                                        _Env...>)
         {
-            return __dom.transform_sender((_Sender&&)__sndr, __env...);
+            return __dom.transform_sender(static_cast<_Sender&&>(__sndr),
+                                          __env...);
         }
         else
         {
-            return default_domain().transform_sender((_Sender&&)__sndr,
-                                                     __env...);
+            return default_domain().transform_sender(
+                static_cast<_Sender&&>(__sndr), __env...);
         }
     }
 };
@@ -702,8 +672,9 @@
     template <class _Self = __transform_sender, class _Domain, class _Sender,
               class... _Env>
     STDEXEC_ATTRIBUTE((always_inline))
-    /*constexpr*/ decltype(auto) operator()(_Domain __dom, _Sender&& __sndr,
-                                            const _Env&... __env) const
+    /*constexpr*/
+    decltype(auto) operator()(_Domain __dom, _Sender&& __sndr,
+                              const _Env&... __env) const
     {
         using _Sender2 = __call_result_t<__transform_sender_1, _Domain, _Sender,
                                          const _Env&...>;
@@ -711,16 +682,17 @@
         // apply the transform recursively.
         if constexpr (__decay_same_as<_Sender, _Sender2>)
         {
-            return __transform_sender_1()(__dom, (_Sender&&)__sndr, __env...);
+            return __transform_sender_1()(__dom, static_cast<_Sender&&>(__sndr),
+                                          __env...);
         }
         else
         {
             // We transformed the sender and got back a different sender.
             // Transform that one too.
-            return _Self()(
-                __dom,
-                __transform_sender_1()(__dom, (_Sender&&)__sndr, __env...),
-                __env...);
+            return _Self()(__dom,
+                           __transform_sender_1()(
+                               __dom, static_cast<_Sender&&>(__sndr), __env...),
+                           __env...);
         }
     }
 };
@@ -733,14 +705,14 @@
     // requested domain.
     template <class _Domain, sender_expr _Sender, class _Env>
         requires same_as<__early_domain_of_t<_Sender>, dependent_domain>
-    /*constexpr*/ decltype(auto) operator()(_Domain __dom, _Sender&& __sndr,
-                                            const _Env& __env) const
+    /*constexpr*/ auto operator()(_Domain __dom, _Sender&& __sndr,
+                                  const _Env& __env) const -> decltype(auto)
     {
         static_assert(__none_of<_Domain, dependent_domain>);
-        return __transform_sender()(
-            __dom,
-            dependent_domain().transform_sender((_Sender&&)__sndr, __env),
-            __env);
+        return __transform_sender()(__dom,
+                                    dependent_domain().transform_sender(
+                                        static_cast<_Sender&&>(__sndr), __env),
+                                    __env);
     }
 };
 } // namespace __domain
@@ -766,20 +738,23 @@
 
 template <sender_expr _Sender, class _Env>
     requires same_as<__early_domain_of_t<_Sender>, dependent_domain>
-decltype(auto) dependent_domain::transform_sender(_Sender&& __sndr,
-                                                  const _Env& __env) const
+auto dependent_domain::transform_sender(_Sender&& __sndr,
+                                        const _Env& __env) const
+    -> decltype(auto)
 {
     // apply any algorithm-specific transformation to the environment
-    const auto& __env2 = transform_env(*this, (_Sender&&)__sndr, __env);
+    const auto& __env2 = transform_env(*this, static_cast<_Sender&&>(__sndr),
+                                       __env);
 
     // recursively transform the sender to determine the domain
-    return __sexpr_apply((_Sender&&)__sndr,
+    return __sexpr_apply(static_cast<_Sender&&>(__sndr),
                          [&]<class _Tag, class _Data, class... _Childs>(
                              _Tag, _Data&& __data, _Childs&&... __childs) {
         // TODO: propagate meta-exceptions here:
         auto __sndr2 = __make_sexpr<_Tag>(
-            (_Data&&)__data, __domain::__transform_sender()(
-                                 *this, (_Childs&&)__childs, __env2)...);
+            static_cast<_Data&&>(__data),
+            __domain::__transform_sender()(
+                *this, static_cast<_Childs&&>(__childs), __env2)...);
         using _Sender2 = decltype(__sndr2);
 
         auto __domain2 = __sexpr_apply(__sndr2, __domain::__common_domain_fn());
@@ -795,23 +770,9 @@
             return __domain::__transform_sender()(__domain2, std::move(__sndr2),
                                                   __env);
         }
-        STDEXEC_UNREACHABLE();
     });
 }
 
-// A helper for use when building sender trees where each node must be
-// transformed.
-template <class _Domain, class _Env>
-auto __make_transformer(_Domain, const _Env& __env)
-{
-    return [&]<class _Tag>(_Tag) {
-        return [&]<class... _Args>(_Args&&... __args) -> decltype(auto) {
-            return stdexec::transform_sender(_Domain(),
-                                             _Tag()((_Args&&)__args...), __env);
-        };
-    };
-}
-
 /////////////////////////////////////////////////////////////////////////////
 template <class _Tag, class _Domain, class _Sender, class... _Args>
 concept __has_implementation_for =
@@ -825,20 +786,22 @@
     template <class _Domain, class _Tag, class _Sender, class... _Args>
         requires __has_implementation_for<_Tag, _Domain, _Sender, _Args...>
     STDEXEC_ATTRIBUTE((always_inline))
-        /*constexpr*/ decltype(auto)
+        /*constexpr*/
+        decltype(auto)
             operator()(_Domain __dom, _Tag, _Sender&& __sndr,
                        _Args&&... __args) const
     {
         if constexpr (__domain::__has_apply_sender<_Domain, _Tag, _Sender,
                                                    _Args...>)
         {
-            return __dom.apply_sender(_Tag(), (_Sender&&)__sndr,
-                                      (_Args&&)__args...);
+            return __dom.apply_sender(_Tag(), static_cast<_Sender&&>(__sndr),
+                                      static_cast<_Args&&>(__args)...);
         }
         else
         {
-            return default_domain().apply_sender(_Tag(), (_Sender&&)__sndr,
-                                                 (_Args&&)__args...);
+            return default_domain().apply_sender(
+                _Tag(), static_cast<_Sender&&>(__sndr),
+                static_cast<_Args&&>(__args)...);
         }
     }
 } apply_sender{};
@@ -884,27 +847,28 @@
         {
             // Computing the type of the transformed sender returned an error
             // type. Propagate it.
-            return (_TfxSender(*)()) nullptr;
+            return static_cast<_TfxSender (*)()>(nullptr);
         }
         else if constexpr (__with_tag_invoke<_Sender, _Env>)
         {
             using _Result = tag_invoke_result_t<get_completion_signatures_t,
                                                 _TfxSender, _Env>;
-            return (_Result(*)()) nullptr;
+            return static_cast<_Result (*)()>(nullptr);
         }
         else if constexpr (__with_member_alias<_Sender, _Env>)
         {
             using _Result = __member_alias_t<_Sender, _Env>;
-            return (_Result(*)()) nullptr;
+            return static_cast<_Result (*)()>(nullptr);
         }
         else if constexpr (__awaitable<_Sender, __env::__promise<_Env>>)
         {
-            using _Result = __await_result_t<_Sender, __env::__promise<_Env>>;
-            return (completion_signatures<
-                    // set_value_t() or set_value_t(T)
-                    __minvoke<__remove<void, __qf<set_value_t>>, _Result>,
-                    set_error_t(std::exception_ptr),
-                    set_stopped_t()>(*)()) nullptr;
+            using _AwaitResult =
+                __await_result_t<_Sender, __env::__promise<_Env>>;
+            using _Result = completion_signatures<
+                // set_value_t() or set_value_t(T)
+                __minvoke<__remove<void, __qf<set_value_t>>, _AwaitResult>,
+                set_error_t(std::exception_ptr), set_stopped_t()>;
+            return static_cast<_Result (*)()>(nullptr);
         }
         else if constexpr (__is_debug_env<_Env>)
         {
@@ -913,14 +877,14 @@
             // is.
             using _Completions [[maybe_unused]] =
                 tag_invoke_result_t<get_completion_signatures_t, _Sender, _Env>;
-            return (__debug::__completion_signatures(*)()) nullptr;
+            return static_cast<__debug::__completion_signatures (*)()>(nullptr);
         }
         else
         {
             using _Result =
                 __mexception<_UNRECOGNIZED_SENDER_TYPE_<>,
                              _WITH_SENDER_<_Sender>, _WITH_ENVIRONMENT_<_Env>>;
-            return (_Result(*)()) nullptr;
+            return static_cast<_Result (*)()>(nullptr);
         }
     }
 
@@ -969,7 +933,8 @@
     sender<_Sender> && //
     requires(_Sender&& __sndr, _Env&& __env) {
         {
-            get_completion_signatures((_Sender&&)__sndr, (_Env&&)__env)
+            get_completion_signatures(static_cast<_Sender&&>(__sndr),
+                                      static_cast<_Env&&>(__env))
         } -> __valid_completion_signatures;
     };
 
@@ -983,7 +948,8 @@
                                      const _Env& __env) noexcept
 {
     using __completions_t = __completion_signatures_of_t<_Sender, _Env>;
-    stdexec::__debug_sender<__completions_t>((_Sender&&)__sndr, __env);
+    stdexec::__debug_sender<__completions_t>(static_cast<_Sender&&>(__sndr),
+                                             __env);
     return __completions_t{};
 }
 
@@ -1286,10 +1252,10 @@
         noexcept(nothrow_tag_invocable<schedule_t, _Scheduler>)
     {
         static_assert(sender<tag_invoke_result_t<schedule_t, _Scheduler>>);
-        return tag_invoke(schedule_t{}, (_Scheduler&&)__sched);
+        return tag_invoke(schedule_t{}, static_cast<_Scheduler&&>(__sched));
     }
 
-    friend constexpr bool tag_invoke(forwarding_query_t, schedule_t)
+    friend constexpr auto tag_invoke(forwarding_query_t, schedule_t) -> bool
     {
         return false;
     }
@@ -1315,7 +1281,7 @@
 concept __has_schedule = //
     requires(_Scheduler&& __sched) {
         {
-            schedule((_Scheduler&&)__sched)
+            schedule(static_cast<_Scheduler&&>(__sched))
         } -> sender;
     };
 
@@ -1325,7 +1291,7 @@
              get_completion_scheduler_t<set_value_t>&& __tag) {
         {
             tag_invoke(std::move(__tag),
-                       get_env(schedule((_Scheduler&&)__sched)))
+                       get_env(schedule(static_cast<_Scheduler&&>(__sched))))
         } -> same_as<__decay_t<_Scheduler>>;
     };
 
@@ -1359,9 +1325,7 @@
 {
     template <class _Op>
         requires tag_invocable<start_t, _Op&>
-    STDEXEC_ATTRIBUTE((always_inline)) //
-        void
-        operator()(_Op& __op) const noexcept
+    STDEXEC_ATTRIBUTE((always_inline)) void operator()(_Op& __op) const noexcept
     {
         static_assert(nothrow_tag_invocable<start_t, _Op&>);
         (void)tag_invoke(start_t{}, __op);
@@ -1389,12 +1353,12 @@
 {
 struct __promise_base
 {
-    __coro::suspend_always initial_suspend() noexcept
+    auto initial_suspend() noexcept -> __coro::suspend_always
     {
         return {};
     }
 
-    [[noreturn]] __coro::suspend_always final_suspend() noexcept
+    [[noreturn]] auto final_suspend() noexcept -> __coro::suspend_always
     {
         std::terminate();
     }
@@ -1472,25 +1436,26 @@
 
         explicit __t(auto&, _Receiver& __rcvr) noexcept : __rcvr_(__rcvr) {}
 
-        __coro::coroutine_handle<> unhandled_stopped() noexcept
+        auto unhandled_stopped() noexcept -> __coro::coroutine_handle<>
         {
-            set_stopped((_Receiver&&)__rcvr_);
+            set_stopped(static_cast<_Receiver&&>(__rcvr_));
             // Returning noop_coroutine here causes the __connect_awaitable
             // coroutine to never resume past the point where it co_await's
             // the awaitable.
             return __coro::noop_coroutine();
         }
 
-        stdexec::__t<__operation<_ReceiverId>> get_return_object() noexcept
+        auto get_return_object() noexcept
+            -> stdexec::__t<__operation<_ReceiverId>>
         {
             return stdexec::__t<__operation<_ReceiverId>>{
                 __coro::coroutine_handle<__t>::from_promise(*this)};
         }
 
         template <class _Awaitable>
-        _Awaitable&& await_transform(_Awaitable&& __awaitable) noexcept
+        auto await_transform(_Awaitable&& __awaitable) noexcept -> _Awaitable&&
         {
-            return (_Awaitable&&)__awaitable;
+            return static_cast<_Awaitable&&>(__awaitable);
         }
 
         template <class _Awaitable>
@@ -1499,7 +1464,8 @@
             noexcept(nothrow_tag_invocable<as_awaitable_t, _Awaitable, __t&>)
                 -> tag_invoke_result_t<as_awaitable_t, _Awaitable, __t&>
         {
-            return tag_invoke(as_awaitable, (_Awaitable&&)__awaitable, *this);
+            return tag_invoke(as_awaitable,
+                              static_cast<_Awaitable&&>(__awaitable), *this);
         }
 
         // Pass through the get_env receiver query
@@ -1525,13 +1491,15 @@
     template <class _Fun, class... _Ts>
     static auto __co_call(_Fun __fun, _Ts&&... __as) noexcept
     {
-        auto __fn = [&, __fun]() noexcept { __fun((_Ts&&)__as...); };
+        auto __fn = [&, __fun]() noexcept {
+            __fun(static_cast<_Ts&&>(__as)...);
+        };
 
         struct __awaiter
         {
             decltype(__fn) __fn_;
 
-            static constexpr bool await_ready() noexcept
+            static constexpr auto await_ready() noexcept -> bool
             {
                 return false;
             }
@@ -1554,26 +1522,29 @@
 #if STDEXEC_GCC() && (__GNUC__ > 11)
     __attribute__((__used__))
 #endif
-    static __operation_t<_Receiver>
+    static auto
         __co_impl(_Awaitable __awaitable, _Receiver __rcvr)
+            -> __operation_t<_Receiver>
     {
         using __result_t = __await_result_t<_Awaitable, __promise_t<_Receiver>>;
         std::exception_ptr __eptr;
         try
         {
             if constexpr (same_as<__result_t, void>)
-                co_await (co_await (_Awaitable&&) __awaitable,
-                          __co_call(set_value, (_Receiver&&)__rcvr));
+                co_await (
+                    co_await static_cast<_Awaitable&&>(__awaitable),
+                    __co_call(set_value, static_cast<_Receiver&&>(__rcvr)));
             else
-                co_await __co_call(set_value, (_Receiver&&)__rcvr,
-                                   co_await (_Awaitable&&) __awaitable);
+                co_await __co_call(
+                    set_value, static_cast<_Receiver&&>(__rcvr),
+                    co_await static_cast<_Awaitable&&>(__awaitable));
         }
         catch (...)
         {
             __eptr = std::current_exception();
         }
-        co_await __co_call(set_error, (_Receiver&&)__rcvr,
-                           (std::exception_ptr&&)__eptr);
+        co_await __co_call(set_error, static_cast<_Receiver&&>(__rcvr),
+                           static_cast<std::exception_ptr&&>(__eptr));
     }
 
     template <receiver _Receiver, class _Awaitable>
@@ -1587,10 +1558,11 @@
   public:
     template <class _Receiver, __awaitable<__promise_t<_Receiver>> _Awaitable>
         requires receiver_of<_Receiver, __completions_t<_Receiver, _Awaitable>>
-    __operation_t<_Receiver> operator()(_Awaitable&& __awaitable,
-                                        _Receiver __rcvr) const
+    auto operator()(_Awaitable&& __awaitable, _Receiver __rcvr) const
+        -> __operation_t<_Receiver>
     {
-        return __co_impl((_Awaitable&&)__awaitable, (_Receiver&&)__rcvr);
+        return __co_impl(static_cast<_Awaitable&&>(__awaitable),
+                         static_cast<_Receiver&&>(__rcvr));
     }
 };
 } // namespace __connect_awaitable_
@@ -1632,7 +1604,7 @@
 struct connect_t
 {
     template <class _Sender, class _Env>
-    static constexpr bool __check_signatures()
+    static constexpr auto __check_signatures() -> bool
     {
         if constexpr (sender_in<_Sender, _Env>)
         {
@@ -1709,16 +1681,18 @@
                     tag_invoke_result_t<connect_t, _TfxSender, _Receiver>>,
                 "stdexec::connect(sender, receiver) must return a type that "
                 "satisfies the operation_state concept");
-            return tag_invoke(
-                connect_t{},
-                transform_sender(__domain, (_Sender&&)__sndr, __env),
-                (_Receiver&&)__rcvr);
+            return tag_invoke(connect_t{},
+                              transform_sender(__domain,
+                                               static_cast<_Sender&&>(__sndr),
+                                               __env),
+                              static_cast<_Receiver&&>(__rcvr));
         }
         else if constexpr (__connectable_with_co_await<_Sender, _Receiver>)
         {
             return __connect_awaitable( //
-                transform_sender(__domain, (_Sender&&)__sndr, __env),
-                (_Receiver&&)__rcvr);
+                transform_sender(__domain, static_cast<_Sender&&>(__sndr),
+                                 __env),
+                static_cast<_Receiver&&>(__rcvr));
         }
         else
         {
@@ -1726,12 +1700,14 @@
             // useful debugging information.
             using __tag_invoke::tag_invoke;
             tag_invoke(*this,
-                       transform_sender(__domain, (_Sender&&)__sndr, __env),
-                       (_Receiver&&)__rcvr);
+                       transform_sender(__domain,
+                                        static_cast<_Sender&&>(__sndr), __env),
+                       static_cast<_Receiver&&>(__rcvr));
         }
     }
 
-    friend constexpr bool tag_invoke(forwarding_query_t, connect_t) noexcept
+    friend constexpr auto tag_invoke(forwarding_query_t, connect_t) noexcept
+        -> bool
     {
         return false;
     }
@@ -1748,13 +1724,15 @@
                     sender_in<_Sender, env_of_t<_Receiver>> && //
                     __receiver_from<_Receiver, _Sender> &&     //
                     requires(_Sender&& __sndr, _Receiver&& __rcvr) {
-                        connect((_Sender&&)__sndr, (_Receiver&&)__rcvr);
+                        connect(static_cast<_Sender&&>(__sndr),
+                                static_cast<_Receiver&&>(__rcvr));
                     };
 
 template <class _Tag, class... _Args>
-_Tag __tag_of_sig_(_Tag (*)(_Args...));
+auto __tag_of_sig_(_Tag (*)(_Args...)) -> _Tag;
 template <class _Sig>
-using __tag_of_sig_t = decltype(stdexec::__tag_of_sig_((_Sig*)nullptr));
+using __tag_of_sig_t =
+    decltype(stdexec::__tag_of_sig_(static_cast<_Sig*>(nullptr)));
 
 template <class _Sender, class _SetSig, class _Env = empty_env>
 concept sender_of =
@@ -1788,12 +1766,13 @@
     {
         try
         {
-            __self.__result_->template emplace<1>((_Us&&)__us...);
+            __self.__result_->template emplace<1>(static_cast<_Us&&>(__us)...);
             __self.__continuation_.resume();
         }
         catch (...)
         {
-            set_error((__receiver_base&&)__self, std::current_exception());
+            set_error(static_cast<__receiver_base&&>(__self),
+                      std::current_exception());
         }
     }
 
@@ -1802,13 +1781,13 @@
                            _Error&& __err) noexcept
     {
         if constexpr (__decays_to<_Error, std::exception_ptr>)
-            __self.__result_->template emplace<2>((_Error&&)__err);
+            __self.__result_->template emplace<2>(static_cast<_Error&&>(__err));
         else if constexpr (__decays_to<_Error, std::error_code>)
             __self.__result_->template emplace<2>(
                 std::make_exception_ptr(std::system_error(__err)));
         else
             __self.__result_->template emplace<2>(
-                std::make_exception_ptr((_Error&&)__err));
+                std::make_exception_ptr(static_cast<_Error&&>(__err)));
         __self.__continuation_.resume();
     }
 
@@ -1837,8 +1816,8 @@
         }
 
         // Forward get_env query to the coroutine promise
-        friend env_of_t<_Promise&> tag_invoke(get_env_t,
-                                              const __t& __self) noexcept
+        friend auto tag_invoke(get_env_t, const __t& __self) noexcept
+            -> env_of_t<_Promise&>
         {
             auto __continuation =
                 __coro::coroutine_handle<_Promise>::from_address(
@@ -1852,7 +1831,7 @@
 // by packaging the values into a tuple.
 // See: https://github.com/cplusplus/sender-receiver/issues/182
 template <std::size_t _Count>
-extern const __q<std::tuple> __as_single;
+extern const __q<__decayed_tuple> __as_single;
 
 template <>
 inline const __q<__midentity> __as_single<1>;
@@ -1876,12 +1855,12 @@
 template <class _Value>
 struct __sender_awaitable_base
 {
-    bool await_ready() const noexcept
+    [[nodiscard]] auto await_ready() const noexcept -> bool
     {
         return false;
     }
 
-    _Value await_resume()
+    auto await_resume() -> _Value
     {
         switch (__result_.index())
         {
@@ -1890,7 +1869,7 @@
                 break;
             case 1: // set_value
                 if constexpr (!std::is_void_v<_Value>)
-                    return (_Value&&)std::get<1>(__result_);
+                    return static_cast<_Value&&>(std::get<1>(__result_));
                 else
                     return;
             case 2: // set_error
@@ -1914,7 +1893,7 @@
     {
         __t(_Sender&& sndr, __coro::coroutine_handle<_Promise> __hcoro) //
             noexcept(__nothrow_connectable<_Sender, __receiver>) :
-            __op_state_(connect((_Sender&&)sndr,
+            __op_state_(connect(static_cast<_Sender&&>(sndr),
                                 __receiver{{&this->__result_, __hcoro}}))
         {}
 
@@ -1946,12 +1925,12 @@
 
 struct __unspecified
 {
-    __unspecified get_return_object() noexcept;
-    __unspecified initial_suspend() noexcept;
-    __unspecified final_suspend() noexcept;
+    auto get_return_object() noexcept -> __unspecified;
+    auto initial_suspend() noexcept -> __unspecified;
+    auto final_suspend() noexcept -> __unspecified;
     void unhandled_exception() noexcept;
     void return_void() noexcept;
-    __coro::coroutine_handle<> unhandled_stopped() noexcept;
+    auto unhandled_stopped() noexcept -> __coro::coroutine_handle<>;
 };
 
 struct as_awaitable_t
@@ -1965,10 +1944,12 @@
             constexpr bool _Nothrow =
                 nothrow_tag_invocable<as_awaitable_t, _Tp, _Promise&>;
             return static_cast<_Result (*)() noexcept(_Nothrow)>(nullptr);
+            // NOLINTNEXTLINE(bugprone-branch-clone)
         }
         else if constexpr (__awaitable<_Tp, __unspecified>)
         { // NOT __awaitable<_Tp, _Promise> !!
-            return static_cast < _Tp && (*)() noexcept > (nullptr);
+            using _Result = _Tp&&;
+            return static_cast<_Result (*)() noexcept>(nullptr);
         }
         else if constexpr (__awaitable_sender<_Tp, _Promise>)
         {
@@ -1979,7 +1960,8 @@
         }
         else
         {
-            return static_cast < _Tp && (*)() noexcept > (nullptr);
+            using _Result = _Tp&&;
+            return static_cast<_Result (*)() noexcept>(nullptr);
         }
     }
     template <class _Tp, class _Promise>
@@ -1994,21 +1976,23 @@
         {
             using _Result = tag_invoke_result_t<as_awaitable_t, _Tp, _Promise&>;
             static_assert(__awaitable<_Result, _Promise>);
-            return tag_invoke(*this, (_Tp&&)__t, __promise);
+            return tag_invoke(*this, static_cast<_Tp&&>(__t), __promise);
+            // NOLINTNEXTLINE(bugprone-branch-clone)
         }
         else if constexpr (__awaitable<_Tp, __unspecified>)
         { // NOT __awaitable<_Tp, _Promise> !!
-            return (_Tp&&)__t;
+            return static_cast<_Tp&&>(__t);
         }
         else if constexpr (__awaitable_sender<_Tp, _Promise>)
         {
             auto __hcoro =
                 __coro::coroutine_handle<_Promise>::from_promise(__promise);
-            return __sender_awaitable_t<_Promise, _Tp>{(_Tp&&)__t, __hcoro};
+            return __sender_awaitable_t<_Promise, _Tp>{static_cast<_Tp&&>(__t),
+                                                       __hcoro};
         }
         else
         {
-            return (_Tp&&)__t;
+            return static_cast<_Tp&&>(__t);
         }
     }
 };
@@ -2053,12 +2037,13 @@
         // exception and terminate() is called.
     }
 
-    __coro::coroutine_handle<> handle() const noexcept
+    [[nodiscard]] auto handle() const noexcept -> __coro::coroutine_handle<>
     {
         return __coro_;
     }
 
-    __coro::coroutine_handle<> unhandled_stopped() const noexcept
+    [[nodiscard]] auto unhandled_stopped() const noexcept
+        -> __coro::coroutine_handle<>
     {
         return __stopped_callback_(__coro_.address());
     }
@@ -2080,13 +2065,14 @@
         __continuation_{__coro}
     {}
 
-    __coro::coroutine_handle<_Promise> handle() const noexcept
+    auto handle() const noexcept -> __coro::coroutine_handle<_Promise>
     {
         return __coro::coroutine_handle<_Promise>::from_address(
             __continuation_.handle().address());
     }
 
-    __coro::coroutine_handle<> unhandled_stopped() const noexcept
+    [[nodiscard]] auto unhandled_stopped() const noexcept
+        -> __coro::coroutine_handle<>
     {
         return __continuation_.unhandled_stopped();
     }
@@ -2110,12 +2096,12 @@
         __continuation_ = __continuation;
     }
 
-    __continuation_handle<> continuation() const noexcept
+    [[nodiscard]] auto continuation() const noexcept -> __continuation_handle<>
     {
         return __continuation_;
     }
 
-    __coro::coroutine_handle<> unhandled_stopped() noexcept
+    auto unhandled_stopped() noexcept -> __coro::coroutine_handle<>
     {
         return __continuation_.unhandled_stopped();
     }
@@ -2132,7 +2118,8 @@
         -> __call_result_t<as_awaitable_t, _Value, _Promise&>
     {
         static_assert(derived_from<_Promise, with_awaitable_senders>);
-        return as_awaitable((_Value&&)__val, static_cast<_Promise&>(*this));
+        return as_awaitable(static_cast<_Value&&>(__val),
+                            static_cast<_Promise&>(*this));
     }
 };
 } // namespace __with_awaitable_senders
@@ -2146,7 +2133,7 @@
 inline constexpr auto __ref = []<class _Ty>(_Ty& __ty) noexcept {
     return [__ty = &__ty]() noexcept -> decltype(auto) { return (*__ty); };
 };
-}
+} // namespace
 
 template <class _Ty>
 using __ref_t = decltype(__ref(__declval<_Ty&>()));
@@ -2173,7 +2160,8 @@
     friend void tag_invoke(_Tag __tag, __receiver&& __self,
                            _As&&... __as) noexcept
     {
-        __tag((_Receiver&&)__self.__opref_().__rcvr_, (_As&&)__as...);
+        __tag(static_cast<_Receiver&&>(__self.__opref_().__rcvr_),
+              static_cast<_As&&>(__as)...);
         __self.__delete_op();
     }
 
@@ -2212,12 +2200,14 @@
     using _Receiver = stdexec::__t<_ReceiverId>;
     using __receiver_t = __receiver<__ref_t<__operation>>;
 
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Receiver __rcvr_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Receiver __rcvr_;
     connect_result_t<_Sender, __receiver_t> __op_state_;
 
     __operation(_Sender&& __sndr, _Receiver __rcvr) :
-        __rcvr_((_Receiver&&)__rcvr),
-        __op_state_(connect((_Sender&&)__sndr, __receiver_t{__ref(*this)}))
+        __rcvr_(static_cast<_Receiver&&>(__rcvr)),
+        __op_state_(
+            connect(static_cast<_Sender&&>(__sndr), __receiver_t{__ref(*this)}))
     {}
 };
 
@@ -2240,7 +2230,8 @@
             try
             {
                 std::allocator_traits<_OpAlloc>::construct(
-                    __op_alloc, __op, (_Sender&&)__sndr, (_Receiver&&)__rcvr);
+                    __op_alloc, __op, static_cast<_Sender&&>(__sndr),
+                    static_cast<_Receiver&&>(__rcvr));
                 start(__op->__op_state_);
             }
             catch (...)
@@ -2253,7 +2244,8 @@
         else
         {
             start((new __operation<__id<_Sender>, __id<_Receiver>>{
-                       (_Sender&&)__sndr, (_Receiver&&)__rcvr})
+                       static_cast<_Sender&&>(__sndr),
+                       static_cast<_Receiver&&>(__rcvr)})
                       ->__op_state_);
         }
     }
@@ -2280,13 +2272,13 @@
         return __make_sexpr<_Tag>();
     }
 
-    friend forward_progress_guarantee
-        tag_invoke(get_forward_progress_guarantee_t, __scheduler) noexcept
+    friend auto tag_invoke(get_forward_progress_guarantee_t,
+                           __scheduler) noexcept -> forward_progress_guarantee
     {
         return forward_progress_guarantee::weakly_parallel;
     }
 
-    bool operator==(const __scheduler&) const noexcept = default;
+    auto operator==(const __scheduler&) const noexcept -> bool = default;
 };
 } // namespace __inln
 
@@ -2309,7 +2301,7 @@
 
     static constexpr auto start = //
         []<class _Receiver>(__ignore, _Receiver& __rcvr) noexcept -> void {
-        set_value((_Receiver&&)__rcvr);
+        set_value(static_cast<_Receiver&&>(__rcvr));
     };
 };
 
@@ -2326,7 +2318,8 @@
     {
         using receiver_concept = receiver_t;
         using __id = __detached_receiver;
-        STDEXEC_ATTRIBUTE((no_unique_address)) _Env __env_;
+        STDEXEC_ATTRIBUTE((no_unique_address))
+        _Env __env_;
 
         template <same_as<set_value_t> _Tag, class... _As>
         friend void tag_invoke(_Tag, __t&&, _As&&...) noexcept
@@ -2342,7 +2335,8 @@
         friend void tag_invoke(_Tag, __t&&) noexcept
         {}
 
-        friend const _Env& tag_invoke(get_env_t, const __t& __self) noexcept
+        friend auto tag_invoke(get_env_t, const __t& __self) noexcept
+            -> const _Env&
         {
             // BUGBUG NOT TO SPEC
             return __self.__env_;
@@ -2360,7 +2354,7 @@
     void operator()(_Sender&& __sndr) const
     {
         auto __domain = __get_early_domain(__sndr);
-        stdexec::apply_sender(__domain, *this, (_Sender&&)__sndr);
+        stdexec::apply_sender(__domain, *this, static_cast<_Sender&&>(__sndr));
     }
 
     template <class _Env, sender_in<_Env> _Sender>
@@ -2369,8 +2363,8 @@
     void operator()(_Sender&& __sndr, _Env&& __env) const
     {
         auto __domain = __get_late_domain(__sndr, __env);
-        stdexec::apply_sender(__domain, *this, (_Sender&&)__sndr,
-                              (_Env&&)__env);
+        stdexec::apply_sender(__domain, *this, static_cast<_Sender&&>(__sndr),
+                              static_cast<_Env&&>(__env));
     }
 
     using _Sender = __0;
@@ -2385,7 +2379,8 @@
         requires sender_to<_Sender, __detached_receiver_t<_Env>>
     void apply_sender(_Sender&& __sndr, _Env&& __env = {}) const
     {
-        __submit((_Sender&&)__sndr, __detached_receiver_t<_Env>{(_Env&&)__env});
+        __submit(static_cast<_Sender&&>(__sndr),
+                 __detached_receiver_t<_Env>{static_cast<_Env&&>(__env)});
     }
 };
 } // namespace __start_detached
@@ -2429,7 +2424,7 @@
     auto operator()(_Ts&&... __ts) const
         noexcept((__nothrow_decay_copyable<_Ts> && ...))
     {
-        return __make_sexpr<just_t>(__tuple{(_Ts&&)__ts...});
+        return __make_sexpr<just_t>(__tuple{static_cast<_Ts&&>(__ts)...});
     }
 };
 
@@ -2442,7 +2437,8 @@
     auto operator()(_Error&& __err) const
         noexcept(__nothrow_decay_copyable<_Error>)
     {
-        return __make_sexpr<just_error_t>(__tuple{(_Error&&)__err});
+        return __make_sexpr<just_error_t>(
+            __tuple{static_cast<_Error&&>(__err)});
     }
 };
 
@@ -2498,7 +2494,8 @@
         }
         catch (...)
         {
-            set_error((__as_receiver&&)__rcvr, std::exception_ptr());
+            set_error(static_cast<__as_receiver&&>(__rcvr),
+                      std::exception_ptr());
         }
     }
 
@@ -2513,7 +2510,8 @@
     friend void tag_invoke(_Tag, __as_receiver&&) noexcept
     {}
 
-    friend empty_env tag_invoke(get_env_t, const __as_receiver&) noexcept
+    friend auto tag_invoke(get_env_t, const __as_receiver&) noexcept
+        -> empty_env
     {
         return {};
     }
@@ -2528,14 +2526,15 @@
         // Look for a legacy customization
         if constexpr (tag_invocable<execute_t, _Scheduler, _Fun>)
         {
-            tag_invoke(execute_t{}, (_Scheduler&&)__sched, (_Fun&&)__fun);
+            tag_invoke(execute_t{}, static_cast<_Scheduler&&>(__sched),
+                       static_cast<_Fun&&>(__fun));
         }
         else
         {
             auto __domain = query_or(get_domain, __sched, default_domain());
             stdexec::apply_sender(__domain, *this,
-                                  schedule((_Scheduler&&)__sched),
-                                  (_Fun&&)__fun);
+                                  schedule(static_cast<_Scheduler&&>(__sched)),
+                                  static_cast<_Fun&&>(__fun));
         }
     }
 
@@ -2543,7 +2542,8 @@
         requires __callable<_Fun&> && move_constructible<_Fun>
     void apply_sender(_Sender&& __sndr, _Fun __fun) const noexcept(false)
     {
-        __submit((_Sender&&)__sndr, __as_receiver<_Fun>{(_Fun&&)__fun});
+        __submit(static_cast<_Sender&&>(__sndr),
+                 __as_receiver<_Fun>{static_cast<_Fun&&>(__fun)});
     }
 };
 } // namespace __execute_
@@ -2556,7 +2556,7 @@
 {
 template <__class _Dp>
 struct sender_adaptor_closure;
-}
+} // namespace __closure
 
 using __closure::sender_adaptor_closure;
 
@@ -2577,27 +2577,30 @@
 template <class _T0, class _T1>
 struct __compose : sender_adaptor_closure<__compose<_T0, _T1>>
 {
-    STDEXEC_ATTRIBUTE((no_unique_address)) _T0 __t0_;
-    STDEXEC_ATTRIBUTE((no_unique_address)) _T1 __t1_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _T0 __t0_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _T1 __t1_;
 
     template <sender _Sender>
         requires __callable<_T0, _Sender> &&
                  __callable<_T1, __call_result_t<_T0, _Sender>>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
         __call_result_t<_T1, __call_result_t<_T0, _Sender>>
         operator()(_Sender&& __sndr) &&
     {
-        return ((_T1&&)__t1_)(((_T0&&)__t0_)((_Sender&&)__sndr));
+        return static_cast<_T1&&>(__t1_)(
+            static_cast<_T0&&>(__t0_)(static_cast<_Sender&&>(__sndr)));
     }
 
     template <sender _Sender>
         requires __callable<const _T0&, _Sender> &&
                  __callable<const _T1&, __call_result_t<const _T0&, _Sender>>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
         __call_result_t<_T1, __call_result_t<_T0, _Sender>>
         operator()(_Sender&& __sndr) const&
     {
-        return __t1_(__t0_((_Sender&&)__sndr));
+        return __t1_(__t0_(static_cast<_Sender&&>(__sndr)));
     }
 };
 
@@ -2606,52 +2609,54 @@
 {};
 
 template <sender _Sender, __sender_adaptor_closure_for<_Sender> _Closure>
-STDEXEC_ATTRIBUTE((always_inline)) //
+STDEXEC_ATTRIBUTE((always_inline))
 __call_result_t<_Closure, _Sender> operator|(_Sender&& __sndr,
                                              _Closure&& __clsur)
 {
-    return ((_Closure&&)__clsur)((_Sender&&)__sndr);
+    return static_cast<_Closure&&>(__clsur)(static_cast<_Sender&&>(__sndr));
 }
 
 template <__sender_adaptor_closure _T0, __sender_adaptor_closure _T1>
-STDEXEC_ATTRIBUTE((always_inline)) //
+STDEXEC_ATTRIBUTE((always_inline))
 __compose<__decay_t<_T0>, __decay_t<_T1>> operator|(_T0&& __t0, _T1&& __t1)
 {
-    return {{}, (_T0&&)__t0, (_T1&&)__t1};
+    return {{}, static_cast<_T0&&>(__t0), static_cast<_T1&&>(__t1)};
 }
 
 template <class _Fun, class... _As>
 struct __binder_back : sender_adaptor_closure<__binder_back<_Fun, _As...>>
 {
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Fun __fun_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Fun __fun_;
     std::tuple<_As...> __as_;
 
     template <sender _Sender>
         requires __callable<_Fun, _Sender, _As...>
-    STDEXEC_ATTRIBUTE((host, device, always_inline)) //
-        __call_result_t<_Fun, _Sender, _As...>
+    STDEXEC_ATTRIBUTE((host, device,
+                       always_inline)) __call_result_t<_Fun, _Sender, _As...>
         operator()(_Sender&& __sndr) && noexcept(
             __nothrow_callable<_Fun, _Sender, _As...>)
     {
         return __apply(
             [&__sndr,
              this](_As&... __as) -> __call_result_t<_Fun, _Sender, _As...> {
-            return ((_Fun&&)__fun_)((_Sender&&)__sndr, (_As&&)__as...);
+            return static_cast<_Fun&&>(__fun_)(static_cast<_Sender&&>(__sndr),
+                                               static_cast<_As&&>(__as)...);
         },
             __as_);
     }
 
     template <sender _Sender>
         requires __callable<const _Fun&, _Sender, const _As&...>
-    STDEXEC_ATTRIBUTE((host, device))
-        __call_result_t<const _Fun&, _Sender, const _As&...>
+    STDEXEC_ATTRIBUTE((host, device)) auto
         operator()(_Sender&& __sndr) const& //
         noexcept(__nothrow_callable<const _Fun&, _Sender, const _As&...>)
+            -> __call_result_t<const _Fun&, _Sender, const _As&...>
     {
         return __apply(
             [&__sndr, this](const _As&... __as)
                 -> __call_result_t<const _Fun&, _Sender, const _As&...> {
-            return __fun_((_Sender&&)__sndr, __as...);
+            return __fun_(static_cast<_Sender&&>(__sndr), __as...);
         },
             __as_);
     }
@@ -2662,17 +2667,21 @@
 
 namespace __adaptors
 {
+STDEXEC_PRAGMA_PUSH()
+STDEXEC_PRAGMA_IGNORE_GNU("-Wold-style-cast")
+
 // A derived-to-base cast that works even when the base is not
 // accessible from derived.
 template <class _Tp, class _Up>
 STDEXEC_ATTRIBUTE((host, device))
-__copy_cvref_t<_Up&&, _Tp> __c_cast(_Up&& u) noexcept
+auto __c_cast(_Up&& u) noexcept -> __copy_cvref_t<_Up&&, _Tp>
     requires __decays_to<_Tp, _Tp>
 {
     static_assert(std::is_reference_v<__copy_cvref_t<_Up&&, _Tp>>);
     static_assert(STDEXEC_IS_BASE_OF(_Tp, __decay_t<_Up>));
-    return (__copy_cvref_t<_Up&&, _Tp>)(_Up&&)u;
+    return (__copy_cvref_t<_Up&&, _Tp>)static_cast<_Up&&>(u);
 }
+STDEXEC_PRAGMA_POP()
 
 namespace __no
 {
@@ -2688,7 +2697,7 @@
 void tag_invoke(_Tag, __receiver, std::exception_ptr) noexcept;
 template <same_as<set_stopped_t> _Tag>
 void tag_invoke(_Tag, __receiver) noexcept;
-empty_env tag_invoke(get_env_t, __receiver) noexcept;
+auto tag_invoke(get_env_t, __receiver) noexcept -> empty_env;
 } // namespace __no
 
 using __not_a_receiver = __no::__receiver;
@@ -2698,29 +2707,33 @@
 {
     template <class _T1>
         requires constructible_from<_Base, _T1>
-    explicit __adaptor_base(_T1&& __base) : __base_((_T1&&)__base)
+    explicit __adaptor_base(_T1&& __base) : __base_(static_cast<_T1&&>(__base))
     {}
 
   private:
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Base __base_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Base __base_;
 
   protected:
-    STDEXEC_ATTRIBUTE((host, device, always_inline)) //
+    STDEXEC_ATTRIBUTE((host, device, always_inline))
+
     _Base& base() & noexcept
     {
         return __base_;
     }
 
-    STDEXEC_ATTRIBUTE((host, device, always_inline)) //
+    STDEXEC_ATTRIBUTE((host, device, always_inline))
+
     const _Base& base() const& noexcept
     {
         return __base_;
     }
 
-    STDEXEC_ATTRIBUTE((host, device, always_inline)) //
+    STDEXEC_ATTRIBUTE((host, device, always_inline))
+
     _Base&& base() && noexcept
     {
-        return (_Base&&)__base_;
+        return static_cast<_Base&&>(__base_);
     }
 };
 
@@ -2732,30 +2745,33 @@
 // don't shadow type aliases of the same name in base classes. :-O
 // On mingw gcc, 'bool(type::existing_member_function)' evaluates to true,
 // but 'int(type::existing_member_function)' is an error (as desired).
-#define _DISPATCH_MEMBER(_TAG)                                                 \
+#define STDEXEC_DISPATCH_MEMBER(_TAG)                                          \
     template <class _Self, class... _Ts>                                       \
     STDEXEC_ATTRIBUTE((host, device, always_inline))                           \
     static auto __call_##_TAG(_Self&& __self, _Ts&&... __ts) noexcept          \
-        -> decltype(((_Self&&)__self)._TAG((_Ts&&)__ts...))                    \
+        -> decltype((static_cast<_Self&&>(__self))                             \
+                        ._TAG(static_cast<_Ts&&>(__ts)...))                    \
     {                                                                          \
-        static_assert(noexcept(((_Self&&)__self)._TAG((_Ts&&)__ts...)));       \
-        return ((_Self&&)__self)._TAG((_Ts&&)__ts...);                         \
+        static_assert(noexcept((static_cast<_Self&&>(__self))                  \
+                                   ._TAG(static_cast<_Ts&&>(__ts)...)));       \
+        return static_cast<_Self&&>(__self)._TAG(static_cast<_Ts&&>(__ts)...); \
     } /**/
-#define _CALL_MEMBER(_TAG, ...) __call_##_TAG(__VA_ARGS__)
+#define STDEXEC_CALL_MEMBER(_TAG, ...) __call_##_TAG(__VA_ARGS__)
 
 #if STDEXEC_CLANG()
 // Only clang gets this right.
-#define _MISSING_MEMBER(_Dp, _TAG) requires { typename _Dp::_TAG; }
-#define _DEFINE_MEMBER(_TAG) _DISPATCH_MEMBER(_TAG) using _TAG = void
+#define STDEXEC_MISSING_MEMBER(_Dp, _TAG) requires { typename _Dp::_TAG; }
+#define STDEXEC_DEFINE_MEMBER(_TAG)                                            \
+    STDEXEC_DISPATCH_MEMBER(_TAG) using _TAG = void
 #else
-#define _MISSING_MEMBER(_Dp, _TAG) (__missing_##_TAG<_Dp>())
-#define _DEFINE_MEMBER(_TAG)                                                   \
+#define STDEXEC_MISSING_MEMBER(_Dp, _TAG) (__missing_##_TAG<_Dp>())
+#define STDEXEC_DEFINE_MEMBER(_TAG)                                            \
     template <class _Dp>                                                       \
     static constexpr bool __missing_##_TAG() noexcept                          \
     {                                                                          \
         return requires { requires bool(int(_Dp::_TAG)); };                    \
     }                                                                          \
-    _DISPATCH_MEMBER(_TAG)                                                     \
+    STDEXEC_DISPATCH_MEMBER(_TAG)                                              \
     static constexpr int _TAG = 1 /**/
 #endif
 
@@ -2763,10 +2779,10 @@
 struct receiver_adaptor : __adaptor_base<_Base>, receiver_t
 {
     friend _Derived;
-    _DEFINE_MEMBER(set_value);
-    _DEFINE_MEMBER(set_error);
-    _DEFINE_MEMBER(set_stopped);
-    _DEFINE_MEMBER(get_env);
+    STDEXEC_DEFINE_MEMBER(set_value);
+    STDEXEC_DEFINE_MEMBER(set_error);
+    STDEXEC_DEFINE_MEMBER(set_stopped);
+    STDEXEC_DEFINE_MEMBER(get_env);
 
     static constexpr bool __has_base = !derived_from<_Base, __no::__nope>;
 
@@ -2782,15 +2798,16 @@
 
     template <class _Dp>
     STDEXEC_ATTRIBUTE((host, device))
-    static __base_t<_Dp> __get_base(_Dp&& __self) noexcept
+    static auto __get_base(_Dp&& __self) noexcept -> __base_t<_Dp>
     {
         if constexpr (__has_base)
         {
-            return __c_cast<receiver_adaptor>((_Dp&&)__self).base();
+            return __c_cast<receiver_adaptor>(static_cast<_Dp&&>(__self))
+                .base();
         }
         else
         {
-            return ((_Dp&&)__self).base();
+            return static_cast<_Dp&&>(__self).base();
         }
     }
 
@@ -2800,87 +2817,100 @@
                            _As&&... __as) noexcept //
         -> __msecond<                              //
             __if_c<same_as<set_value_t, _SetValue>>,
-            decltype(_CALL_MEMBER(set_value, (_Derived&&)__self,
-                                  (_As&&)__as...))>
+            decltype(STDEXEC_CALL_MEMBER(set_value,
+                                         static_cast<_Derived&&>(__self),
+                                         static_cast<_As&&>(__as)...))>
     {
         static_assert(noexcept(
-            _CALL_MEMBER(set_value, (_Derived&&)__self, (_As&&)__as...)));
-        _CALL_MEMBER(set_value, (_Derived&&)__self, (_As&&)__as...);
+            STDEXEC_CALL_MEMBER(set_value, static_cast<_Derived&&>(__self),
+                                static_cast<_As&&>(__as)...)));
+        STDEXEC_CALL_MEMBER(set_value, static_cast<_Derived&&>(__self),
+                            static_cast<_As&&>(__as)...);
     }
 
     template <same_as<set_value_t> _SetValue, class _Dp = _Derived,
               class... _As>
-        requires _MISSING_MEMBER
+        requires STDEXEC_MISSING_MEMBER
     (_Dp, set_value) &&
-        tag_invocable<_SetValue, __base_t<_Dp>, _As...> STDEXEC_ATTRIBUTE(
-            (host, device, always_inline)) //
-        friend void tag_invoke(_SetValue, _Derived&& __self,
-                               _As&&... __as) noexcept
+        tag_invocable<_SetValue, __base_t<_Dp>, _As...> STDEXEC_ATTRIBUTE((
+            host, device,
+            always_inline)) friend void tag_invoke(_SetValue, _Derived&& __self,
+                                                   _As&&... __as) noexcept
     {
-        stdexec::set_value(__get_base((_Dp&&)__self), (_As&&)__as...);
+        stdexec::set_value(__get_base(static_cast<_Dp&&>(__self)),
+                           static_cast<_As&&>(__as)...);
     }
 
     template <same_as<set_error_t> _SetError, class _Error>
-    STDEXEC_ATTRIBUTE((host, device, always_inline)) //
+    STDEXEC_ATTRIBUTE((host, device, always_inline))
     friend auto tag_invoke(_SetError, _Derived&& __self,
-                           _Error&& __err) noexcept  //
-        -> __msecond<                                //
+                           _Error&& __err) noexcept //
+        -> __msecond<                               //
             __if_c<same_as<set_error_t, _SetError>>,
-            decltype(_CALL_MEMBER(set_error, (_Derived&&)__self,
-                                  (_Error&&)__err))>
+            decltype(STDEXEC_CALL_MEMBER(set_error,
+                                         static_cast<_Derived&&>(__self),
+                                         static_cast<_Error&&>(__err)))>
     {
         static_assert(noexcept(
-            _CALL_MEMBER(set_error, (_Derived&&)__self, (_Error&&)__err)));
-        _CALL_MEMBER(set_error, (_Derived&&)__self, (_Error&&)__err);
+            STDEXEC_CALL_MEMBER(set_error, static_cast<_Derived&&>(__self),
+                                static_cast<_Error&&>(__err))));
+        STDEXEC_CALL_MEMBER(set_error, static_cast<_Derived&&>(__self),
+                            static_cast<_Error&&>(__err));
     }
 
     template <same_as<set_error_t> _SetError, class _Error,
               class _Dp = _Derived>
-        requires _MISSING_MEMBER
+        requires STDEXEC_MISSING_MEMBER
     (_Dp, set_error) &&
-        tag_invocable<_SetError, __base_t<_Dp>, _Error> STDEXEC_ATTRIBUTE(
-            (host, device, always_inline)) //
-        friend void tag_invoke(_SetError, _Derived&& __self,
-                               _Error&& __err) noexcept
+        tag_invocable<_SetError, __base_t<_Dp>, _Error> STDEXEC_ATTRIBUTE((
+            host, device,
+            always_inline)) friend void tag_invoke(_SetError, _Derived&& __self,
+                                                   _Error&& __err) noexcept
     {
-        stdexec::set_error(__get_base((_Derived&&)__self), (_Error&&)__err);
+        stdexec::set_error(__get_base(static_cast<_Derived&&>(__self)),
+                           static_cast<_Error&&>(__err));
     }
 
     template <same_as<set_stopped_t> _SetStopped, class _Dp = _Derived>
-    STDEXEC_ATTRIBUTE((host, device, always_inline))                //
+    STDEXEC_ATTRIBUTE((host, device, always_inline))
     friend auto tag_invoke(_SetStopped, _Derived&& __self) noexcept //
         -> __msecond<                                               //
             __if_c<same_as<set_stopped_t, _SetStopped>>,
-            decltype(_CALL_MEMBER(set_stopped, (_Dp&&)__self))>
+            decltype(STDEXEC_CALL_MEMBER(set_stopped,
+                                         static_cast<_Dp&&>(__self)))>
     {
-        static_assert(noexcept(_CALL_MEMBER(set_stopped, (_Derived&&)__self)));
-        _CALL_MEMBER(set_stopped, (_Derived&&)__self);
+        static_assert(noexcept(
+            STDEXEC_CALL_MEMBER(set_stopped, static_cast<_Derived&&>(__self))));
+        STDEXEC_CALL_MEMBER(set_stopped, static_cast<_Derived&&>(__self));
     }
 
     template <same_as<set_stopped_t> _SetStopped, class _Dp = _Derived>
-        requires _MISSING_MEMBER
+        requires STDEXEC_MISSING_MEMBER
     (_Dp, set_stopped) &&
         tag_invocable<_SetStopped, __base_t<_Dp>> STDEXEC_ATTRIBUTE(
-            (host, device, always_inline)) //
-        friend void tag_invoke(_SetStopped, _Derived&& __self) noexcept
+            (host, device,
+             always_inline)) friend void tag_invoke(_SetStopped,
+                                                    _Derived&& __self) noexcept
     {
-        stdexec::set_stopped(__get_base((_Derived&&)__self));
+        stdexec::set_stopped(__get_base(static_cast<_Derived&&>(__self)));
     }
 
     // Pass through the get_env receiver query
     template <same_as<get_env_t> _GetEnv, class _Dp = _Derived>
-    STDEXEC_ATTRIBUTE((host, device, always_inline)) //
+    STDEXEC_ATTRIBUTE((host, device, always_inline))
     friend auto tag_invoke(_GetEnv, const _Derived& __self) noexcept
-        -> decltype(_CALL_MEMBER(get_env, (const _Dp&)__self))
+        -> decltype(STDEXEC_CALL_MEMBER(get_env,
+                                        static_cast<const _Dp&>(__self)))
     {
-        static_assert(noexcept(_CALL_MEMBER(get_env, __self)));
-        return _CALL_MEMBER(get_env, __self);
+        static_assert(noexcept(STDEXEC_CALL_MEMBER(get_env, __self)));
+        return STDEXEC_CALL_MEMBER(get_env, __self);
     }
 
     template <same_as<get_env_t> _GetEnv, class _Dp = _Derived>
-        requires _MISSING_MEMBER
-    (_Dp, get_env) STDEXEC_ATTRIBUTE((host, device, always_inline)) //
-        friend auto tag_invoke(_GetEnv, const _Derived& __self) noexcept
+        requires STDEXEC_MISSING_MEMBER
+    (_Dp, get_env)
+        STDEXEC_ATTRIBUTE((host, device, always_inline)) friend auto tag_invoke(
+            _GetEnv, const _Derived& __self) noexcept
         -> env_of_t<__base_t<const _Dp&>>
     {
         return stdexec::get_env(__get_base(__self));
@@ -2911,25 +2941,28 @@
     {
         if constexpr (same_as<void, __invoke_result_t<_Fun, _As...>>)
         {
-            __invoke((_Fun&&)__fun, (_As&&)__as...);
-            set_value((_Receiver&&)__rcvr);
+            __invoke(static_cast<_Fun&&>(__fun), static_cast<_As&&>(__as)...);
+            set_value(static_cast<_Receiver&&>(__rcvr));
         }
         else
         {
-            set_value((_Receiver&&)__rcvr,
-                      __invoke((_Fun&&)__fun, (_As&&)__as...));
+            set_value(static_cast<_Receiver&&>(__rcvr),
+                      __invoke(static_cast<_Fun&&>(__fun),
+                               static_cast<_As&&>(__as)...));
         }
     }
     else
     {
         try
         {
-            stdexec::__set_value_invoke<true>((_Receiver&&)__rcvr,
-                                              (_Fun&&)__fun, (_As&&)__as...);
+            stdexec::__set_value_invoke<true>(static_cast<_Receiver&&>(__rcvr),
+                                              static_cast<_Fun&&>(__fun),
+                                              static_cast<_As&&>(__as)...);
         }
         catch (...)
         {
-            set_error((_Receiver&&)__rcvr, std::current_exception());
+            set_error(static_cast<_Receiver&&>(__rcvr),
+                      std::current_exception());
         }
     }
 }
@@ -2998,18 +3031,20 @@
 struct then_t
 {
     template <sender _Sender, __movable_value _Fun>
-    auto operator()(_Sender&& __sndr, _Fun __fun) const
+    auto operator()(_Sender&& __sndr, _Fun __fun) const -> __well_formed_sender
+        auto
     {
         auto __domain = __get_early_domain(__sndr);
         return stdexec::transform_sender(
-            __domain, __make_sexpr<then_t>((_Fun&&)__fun, (_Sender&&)__sndr));
+            __domain, __make_sexpr<then_t>(static_cast<_Fun&&>(__fun),
+                                           static_cast<_Sender&&>(__sndr)));
     }
 
     template <__movable_value _Fun>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     __binder_back<then_t, _Fun> operator()(_Fun __fun) const
     {
-        return {{}, {}, {(_Fun&&)__fun}};
+        return {{}, {}, {static_cast<_Fun&&>(__fun)}};
     }
 
     using _Sender = __1;
@@ -3039,11 +3074,11 @@
         if constexpr (std::same_as<_Tag, set_value_t>)
         {
             stdexec::__set_value_invoke(std::move(__rcvr), std::move(__state),
-                                        (_Args&&)__args...);
+                                        static_cast<_Args&&>(__args)...);
         }
         else
         {
-            _Tag()(std::move(__rcvr), (_Args&&)__args...);
+            _Tag()(std::move(__rcvr), static_cast<_Args&&>(__args)...);
         }
     };
 };
@@ -3082,19 +3117,21 @@
 struct upon_error_t
 {
     template <sender _Sender, __movable_value _Fun>
-    auto operator()(_Sender&& __sndr, _Fun __fun) const
+    auto operator()(_Sender&& __sndr, _Fun __fun) const -> __well_formed_sender
+        auto
     {
         auto __domain = __get_early_domain(__sndr);
         return stdexec::transform_sender(
             __domain,
-            __make_sexpr<upon_error_t>((_Fun&&)__fun, (_Sender&&)__sndr));
+            __make_sexpr<upon_error_t>(static_cast<_Fun&&>(__fun),
+                                       static_cast<_Sender&&>(__sndr)));
     }
 
     template <__movable_value _Fun>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     __binder_back<upon_error_t, _Fun> operator()(_Fun __fun) const
     {
-        return {{}, {}, {(_Fun&&)__fun}};
+        return {{}, {}, {static_cast<_Fun&&>(__fun)}};
     }
 
     using _Sender = __1;
@@ -3124,11 +3161,11 @@
         if constexpr (std::same_as<_Tag, set_error_t>)
         {
             stdexec::__set_value_invoke(std::move(__rcvr), std::move(__state),
-                                        (_Args&&)__args...);
+                                        static_cast<_Args&&>(__args)...);
         }
         else
         {
-            _Tag()(std::move(__rcvr), (_Args&&)__args...);
+            _Tag()(std::move(__rcvr), static_cast<_Args&&>(__args)...);
         }
     };
 };
@@ -3163,21 +3200,22 @@
 {
     template <sender _Sender, __movable_value _Fun>
         requires __callable<_Fun>
-    auto operator()(_Sender&& __sndr, _Fun __fun) const
+    auto operator()(_Sender&& __sndr, _Fun __fun) const -> __well_formed_sender
+        auto
     {
         auto __domain = __get_early_domain(__sndr);
         return stdexec::transform_sender(
             __domain,
-            __make_sexpr<upon_stopped_t>((_Fun&&)__fun, (_Sender&&)__sndr));
+            __make_sexpr<upon_stopped_t>(static_cast<_Fun&&>(__fun),
+                                         static_cast<_Sender&&>(__sndr)));
     }
 
     template <__movable_value _Fun>
         requires __callable<_Fun>
-    STDEXEC_ATTRIBUTE((always_inline)) //
-        __binder_back<upon_stopped_t, _Fun>
+    STDEXEC_ATTRIBUTE((always_inline)) __binder_back<upon_stopped_t, _Fun>
         operator()(_Fun __fun) const
     {
-        return {{}, {}, {(_Fun&&)__fun}};
+        return {{}, {}, {static_cast<_Fun&&>(__fun)}};
     }
 
     using _Sender = __1;
@@ -3207,11 +3245,11 @@
         if constexpr (std::same_as<_Tag, set_stopped_t>)
         {
             stdexec::__set_value_invoke(std::move(__rcvr), std::move(__state),
-                                        (_Args&&)__args...);
+                                        static_cast<_Args&&>(__args)...);
         }
         else
         {
-            _Tag()(std::move(__rcvr), (_Args&&)__args...);
+            _Tag()(std::move(__rcvr), static_cast<_Args&&>(__args)...);
         }
     };
 };
@@ -3236,7 +3274,8 @@
 struct __data
 {
     _Shape __shape_;
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Fun __fun_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Fun __fun_;
     static constexpr auto __mbrs_ =
         __mliterals<&__data::__shape_, &__data::__fun_>();
 };
@@ -3269,19 +3308,23 @@
     template <sender _Sender, integral _Shape, __movable_value _Fun>
     STDEXEC_ATTRIBUTE((host, device))
     auto operator()(_Sender&& __sndr, _Shape __shape, _Fun __fun) const
+        -> __well_formed_sender auto
     {
         auto __domain = __get_early_domain(__sndr);
         return stdexec::transform_sender(
-            __domain, __make_sexpr<bulk_t>(__data{__shape, (_Fun&&)__fun},
-                                           (_Sender&&)__sndr));
+            __domain,
+            __make_sexpr<bulk_t>(__data{__shape, static_cast<_Fun&&>(__fun)},
+                                 static_cast<_Sender&&>(__sndr)));
     }
 
     template <integral _Shape, class _Fun>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     __binder_back<bulk_t, _Shape, _Fun> operator()(_Shape __shape,
                                                    _Fun __fun) const
     {
-        return {{}, {}, {(_Shape&&)__shape, (_Fun&&)__fun}};
+        return {{},
+                {},
+                {static_cast<_Shape&&>(__shape), static_cast<_Fun&&>(__fun)}};
     }
 
     // This describes how to use the pieces of a bulk sender to find
@@ -3326,7 +3369,7 @@
                 {
                     __state.__fun_(__i, __args...);
                 }
-                _Tag()(std::move(__rcvr), (_Args&&)__args...);
+                _Tag()(std::move(__rcvr), static_cast<_Args&&>(__args)...);
             }
             else
             {
@@ -3336,7 +3379,7 @@
                     {
                         __state.__fun_(__i, __args...);
                     }
-                    _Tag()(std::move(__rcvr), (_Args&&)__args...);
+                    _Tag()(std::move(__rcvr), static_cast<_Args&&>(__args)...);
                 }
                 catch (...)
                 {
@@ -3346,7 +3389,7 @@
         }
         else
         {
-            _Tag()(std::move(__rcvr), (_Args&&)__args...);
+            _Tag()(std::move(__rcvr), static_cast<_Args&&>(__args)...);
         }
     };
 };
@@ -3397,12 +3440,13 @@
 };
 
 template <class _Receiver>
-auto __notify_visitor(_Receiver&& __rcvr) noexcept
+auto __notify_visitor(_Receiver& __rcvr) noexcept
 {
     return [&]<class _Tuple>(_Tuple&& __tupl) noexcept -> void {
         __apply(
             [&](auto __tag, auto&&... __args) noexcept -> void {
-            __tag(std::move(__rcvr), __forward_like<_Tuple>(__args)...);
+            __tag(static_cast<_Receiver&&>(__rcvr),
+                  __forward_like<_Tuple>(__args)...);
         },
             __tupl);
     };
@@ -3447,10 +3491,10 @@
     explicit __local_state(_CvrefSender&& __sndr) noexcept :
         __local_state::__local_state_base{{},
                                           &__action<tag_of_t<_CvrefSender>>},
-        __shared_state_(
-            STDEXEC_CALL_EXPLICIT_THIS_MEMFN((_CvrefSender&&)__sndr,
-                                             apply)(__detail::__get_data())
-                .__shared_state)
+        __shared_state_(STDEXEC_CALL_EXPLICIT_THIS_MEMFN(
+                            static_cast<_CvrefSender&&>(__sndr),
+                            apply)(__detail::__get_data())
+                            .__shared_state)
     {}
 
     ~__local_state()
@@ -3465,7 +3509,7 @@
     static void __action(__local_state_base* __self,
                          __action_kind __kind) noexcept
     {
-        __local_state* const __op = static_cast<__local_state*>(__self);
+        auto* const __op = static_cast<__local_state*>(__self);
         if (__kind == __action_kind::__notify)
         {
             __op->__on_stop_.reset();
@@ -3526,8 +3570,8 @@
             try
             {
                 using __tuple_t = __decayed_tuple<_Tag, _As...>;
-                __state.__data_.template emplace<__tuple_t>(__tag,
-                                                            (_As&&)__as...);
+                __state.__data_.template emplace<__tuple_t>(
+                    __tag, static_cast<_As&&>(__as)...);
             }
             catch (...)
             {
@@ -3540,8 +3584,8 @@
             __state.__notify();
         }
 
-        friend const __env_t<_Env>& tag_invoke(get_env_t,
-                                               const __t& __self) noexcept
+        friend auto tag_invoke(get_env_t, const __t& __self) noexcept
+            -> const __env_t<_Env>&
         {
             return __self.__shared_state_->__env_;
         }
@@ -3572,8 +3616,9 @@
     explicit __shared_state(_CvrefSender&& __sndr, _Env __env) :
         __env_(__env::__join(
             __env::__with(__stop_source_.get_token(), get_stop_token),
-            (_Env&&)__env)),
-        __op_state2_(connect((_CvrefSender&&)__sndr, __receiver_t{this}))
+            static_cast<_Env&&>(__env))),
+        __op_state2_(
+            connect(static_cast<_CvrefSender&&>(__sndr), __receiver_t{this}))
     {}
 
     void __start_op() noexcept
@@ -3603,7 +3648,7 @@
         void* const __completion_state = static_cast<void*>(this);
         void* const __old = __head_.exchange(__completion_state,
                                              std::memory_order_acq_rel);
-        __local_state_base* __state = static_cast<__local_state_base*>(__old);
+        auto* __state = static_cast<__local_state_base*>(__old);
 
         while (__state != nullptr)
         {
@@ -3670,7 +3715,8 @@
             _Sender&& __sndr,
             _Receiver&) noexcept -> __local_state<_Sender, _Receiver> {
         static_assert(sender_expr_for<_Sender, _Tag>);
-        return __local_state<_Sender, _Receiver>{(_Sender&&)__sndr};
+        return __local_state<_Sender, _Receiver>{
+            static_cast<_Sender&&>(__sndr)};
     };
 
     static constexpr auto get_completion_signatures = //
@@ -3703,7 +3749,7 @@
                 {
                     // Stop has already been requested. Don't bother starting
                     // the child operations.
-                    stdexec::set_stopped((_Receiver&&)__rcvr);
+                    stdexec::set_stopped(static_cast<_Receiver&&>(__rcvr));
                     return;
                 }
             }
@@ -3763,13 +3809,16 @@
     template <sender _Sender, class _Env = empty_env>
         requires sender_in<_Sender, _Env> && __decay_copyable<env_of_t<_Sender>>
     auto operator()(_Sender&& __sndr, _Env&& __env = {}) const
+        -> __well_formed_sender auto
     {
         auto __domain = __get_late_domain(__sndr, __env);
         return stdexec::transform_sender(
-            __domain, __make_sexpr<split_t>((_Env&&)__env, (_Sender&&)__sndr));
+            __domain, __make_sexpr<split_t>(static_cast<_Env&&>(__env),
+                                            static_cast<_Sender&&>(__sndr)));
     }
 
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
+
     __binder_back<split_t> operator()() const
     {
         return {{}, {}, {}};
@@ -3793,12 +3842,12 @@
         using _Receiver =
             __receiver_t<__child_of<_Sender>, __decay_t<__data_of<_Sender>>>;
         static_assert(sender_to<__child_of<_Sender>, _Receiver>);
-        return __sexpr_apply((_Sender&&)__sndr,
+        return __sexpr_apply(static_cast<_Sender&&>(__sndr),
                              [&]<class _Env, class _Child>(
                                  __ignore, _Env&& __env, _Child&& __child) {
             auto __state =
                 __make_intrusive<__shared_state<_Child, __decay_t<_Env>>>(
-                    (_Child&&)__child, (_Env&&)__env);
+                    static_cast<_Child&&>(__child), static_cast<_Env&&>(__env));
             return __make_sexpr<__split_t>(__data{std::move(__state)});
         });
     }
@@ -3832,7 +3881,7 @@
     }
 
     __data(__data&&) noexcept = default;
-    __data& operator=(__data&&) noexcept = default;
+    auto operator=(__data&&) noexcept -> __data& = default;
 
     ~__data()
     {
@@ -3855,22 +3904,24 @@
     template <sender _Sender, class _Env = empty_env>
         requires sender_in<_Sender, _Env> && __decay_copyable<env_of_t<_Sender>>
     [[nodiscard]] auto operator()(_Sender&& __sndr, _Env&& __env = {}) const
+        -> __well_formed_sender auto
     {
         if constexpr (sender_expr_for<_Sender, __ensure_started_t>)
         {
-            return (_Sender&&)__sndr;
+            return static_cast<_Sender&&>(__sndr);
         }
         else
         {
             auto __domain = __get_late_domain(__sndr, __env);
             return stdexec::transform_sender(
-                __domain, __make_sexpr<ensure_started_t>((_Env&&)__env,
-                                                         (_Sender&&)__sndr));
+                __domain,
+                __make_sexpr<ensure_started_t>(static_cast<_Env&&>(__env),
+                                               static_cast<_Sender&&>(__sndr)));
         }
-        STDEXEC_UNREACHABLE();
     }
 
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
+
     __binder_back<ensure_started_t> operator()() const
     {
         return {{}, {}, {}};
@@ -3894,12 +3945,12 @@
         using _Receiver =
             __receiver_t<__child_of<_Sender>, __decay_t<__data_of<_Sender>>>;
         static_assert(sender_to<__child_of<_Sender>, _Receiver>);
-        return __sexpr_apply((_Sender&&)__sndr,
+        return __sexpr_apply(static_cast<_Sender&&>(__sndr),
                              [&]<class _Env, class _Child>(
                                  __ignore, _Env&& __env, _Child&& __child) {
             auto __state =
                 __make_intrusive<__shared_state<_Child, __decay_t<_Env>>>(
-                    (_Child&&)__child, (_Env&&)__env);
+                    static_cast<_Child&&>(__child), static_cast<_Env&&>(__env));
             return __make_sexpr<__ensure_started_t>(__data{std::move(__state)});
         });
     }
@@ -3936,12 +3987,12 @@
 
         _Operation* __op_state_;
 
-        _Receiver&& base() && noexcept
+        auto base() && noexcept -> _Receiver&&
         {
             return static_cast<_Receiver&&>(__op_state_->*_ReceiverPtr);
         }
 
-        __env_t get_env() const noexcept
+        auto get_env() const noexcept -> __env_t
         {
             return __env::__join(_EnvFns(__op_state_)...,
                                  stdexec::get_env(__op_state_->*_ReceiverPtr));
@@ -3991,7 +4042,8 @@
               class... _As>
     friend void tag_invoke(_Tag, _Self&& __self, _As&&... __as) noexcept
     {
-        _Tag()((_Receiver&&)__self.__rcvr_, (_As&&)__as...);
+        _Tag()(static_cast<_Receiver&&>(__self.__rcvr_),
+               static_cast<_As&&>(__as)...);
     }
 
     template <same_as<get_env_t> _Tag>
@@ -4163,7 +4215,6 @@
                     __env::__without(__env, get_domain));
             }
         }
-        STDEXEC_UNREACHABLE();
     };
 }
 
@@ -4189,17 +4240,16 @@
             else if constexpr (same_as<_Domain, dependent_domain>)
             {
                 using _Domain2 = __late_domain_of_t<_Child, _Env>;
-                return __make_sexpr<__let_t<_Set, _Domain2>>((_Fun&&)__fun,
-                                                             (_Child&&)__child);
+                return __make_sexpr<__let_t<_Set, _Domain2>>(
+                    static_cast<_Fun&&>(__fun), static_cast<_Child&&>(__child));
             }
             else
             {
                 static_assert(!same_as<_Domain, __none_such>);
-                return __make_sexpr<__let_t<_Set, _Domain>>((_Fun&&)__fun,
-                                                            (_Child&&)__child);
+                return __make_sexpr<__let_t<_Set, _Domain>>(
+                    static_cast<_Fun&&>(__fun), static_cast<_Child&&>(__child));
             }
         }
-        STDEXEC_UNREACHABLE();
     };
 }
 
@@ -4218,15 +4268,16 @@
                       __nullable_variant_t>,
                   _Tuples...>;
 
-    decltype(auto) __get_result_receiver(_Receiver&& __rcvr)
+    auto __get_result_receiver(_Receiver&& __rcvr) -> decltype(auto)
     {
         if constexpr (__unknown_context<_Sched>)
         {
-            return (_Receiver&&)__rcvr;
+            return static_cast<_Receiver&&>(__rcvr);
         }
         else
         {
-            return __receiver_with_sched{(_Receiver&&)__rcvr, this->__sched_};
+            return __receiver_with_sched{static_cast<_Receiver&&>(__rcvr),
+                                         this->__sched_};
         }
     }
 
@@ -4243,19 +4294,21 @@
     using __t = _Set;
 
     template <sender _Sender, __movable_value _Fun>
-    auto operator()(_Sender&& __sndr, _Fun __fun) const
+    auto operator()(_Sender&& __sndr, _Fun __fun) const -> __well_formed_sender
+        auto
     {
         auto __domain = __get_early_domain(__sndr);
         return stdexec::transform_sender(
             __domain,
-            __make_sexpr<__let_t<_Set>>((_Fun&&)__fun, (_Sender&&)__sndr));
+            __make_sexpr<__let_t<_Set>>(static_cast<_Fun&&>(__fun),
+                                        static_cast<_Sender&&>(__sndr)));
     }
 
     template <class _Fun>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     __binder_back<__let_t, _Fun> operator()(_Fun __fun) const
     {
-        return {{}, {}, {(_Fun&&)__fun}};
+        return {{}, {}, {static_cast<_Fun&&>(__fun)}};
     }
 
     using _Sender = __1;
@@ -4268,17 +4321,19 @@
                 tag_invoke_t(__let_t, _Sender, _Function)>;
 
     template <sender_expr_for<__let_t<_Set>> _Sender, class _Env>
-    static decltype(auto) transform_env(_Sender&& __sndr, const _Env& __env)
+    static auto transform_env(_Sender&& __sndr, const _Env& __env)
+        -> decltype(auto)
     {
-        return __sexpr_apply((_Sender&&)__sndr,
+        return __sexpr_apply(static_cast<_Sender&&>(__sndr),
                              __mk_transform_env_fn<__let_t<_Set>>(__env));
     }
 
     template <sender_expr_for<__let_t<_Set>> _Sender, class _Env>
         requires same_as<__early_domain_of_t<_Sender>, dependent_domain>
-    static decltype(auto) transform_sender(_Sender&& __sndr, const _Env& __env)
+    static auto transform_sender(_Sender&& __sndr, const _Env& __env)
+        -> decltype(auto)
     {
-        return __sexpr_apply((_Sender&&)__sndr,
+        return __sexpr_apply(static_cast<_Sender&&>(__sndr),
                              __mk_transform_sender_fn<__let_t<_Set>>(__env));
     }
 };
@@ -4316,7 +4371,7 @@
         _Sched __sched = query_or(get_completion_scheduler<_Set>,
                                   stdexec::get_env(__sndr), __none_such());
         return __let_state_t{
-            STDEXEC_CALL_EXPLICIT_THIS_MEMFN((_Sender&&)__sndr,
+            STDEXEC_CALL_EXPLICIT_THIS_MEMFN(static_cast<_Sender&&>(__sndr),
                                              apply)(__detail::__get_data()),
             __sched};
     };
@@ -4329,9 +4384,10 @@
         {
             auto& __args =
                 __state.__args_.template emplace<__decayed_tuple<_As...>>(
-                    (_As&&)__as...);
+                    static_cast<_As&&>(__as)...);
             auto __sndr2 = __apply(std::move(__state.__fun_), __args);
-            auto __rcvr2 = __state.__get_result_receiver((_Receiver&&)__rcvr);
+            auto __rcvr2 =
+                __state.__get_result_receiver(static_cast<_Receiver&&>(__rcvr));
             auto __mkop = [&] {
                 return stdexec::connect(std::move(__sndr2), std::move(__rcvr2));
             };
@@ -4352,11 +4408,12 @@
             _As&&... __as) noexcept -> void {
         if constexpr (std::same_as<_Tag, _Set>)
         {
-            __bind(__state, __rcvr, (_As&&)__as...);
+            __bind(__state, __rcvr, static_cast<_As&&>(__as)...);
         }
         else
         {
-            _Tag()((_Receiver&&)__rcvr, (_As&&)__as...);
+            _Tag()(static_cast<_Receiver&&>(__rcvr),
+                   static_cast<_As&&>(__as)...);
         }
     };
 };
@@ -4386,10 +4443,12 @@
     template <sender _Sender>
     auto operator()(_Sender&& __sndr) const
     {
-        return __make_sexpr<stopped_as_optional_t>(__(), (_Sender&&)__sndr);
+        return __make_sexpr<stopped_as_optional_t>(
+            __(), static_cast<_Sender&&>(__sndr));
     }
 
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
+
     __binder_back<stopped_as_optional_t> operator()() const noexcept
     {
         return {};
@@ -4435,23 +4494,24 @@
             try
             {
                 static_assert(constructible_from<__t<_State>, _Args...>);
-                stdexec::set_value(
-                    (_Receiver&&)__rcvr,
-                    std::optional<__t<_State>>{(_Args&&)__args...});
+                stdexec::set_value(static_cast<_Receiver&&>(__rcvr),
+                                   std::optional<__t<_State>>{
+                                       static_cast<_Args&&>(__args)...});
             }
             catch (...)
             {
-                stdexec::set_error((_Receiver&&)__rcvr,
+                stdexec::set_error(static_cast<_Receiver&&>(__rcvr),
                                    std::current_exception());
             }
         }
         else if constexpr (same_as<_Tag, set_error_t>)
         {
-            stdexec::set_error((_Receiver&&)__rcvr, (_Args&&)__args...);
+            stdexec::set_error(static_cast<_Receiver&&>(__rcvr),
+                               static_cast<_Args&&>(__args)...);
         }
         else
         {
-            stdexec::set_value((_Receiver&&)__rcvr,
+            stdexec::set_value(static_cast<_Receiver&&>(__rcvr),
                                std::optional<__t<_State>>{std::nullopt});
         }
     };
@@ -4462,20 +4522,20 @@
     template <sender _Sender, __movable_value _Error>
     auto operator()(_Sender&& __sndr, _Error __err) const
     {
-        return (_Sender&&)__sndr |
+        return static_cast<_Sender&&>(__sndr) |
                let_stopped(
-                   [__err2 = (_Error&&)__err]() mutable //
+                   [__err2 = static_cast<_Error&&>(__err)]() mutable //
                    noexcept(std::is_nothrow_move_constructible_v<_Error>) {
-            return just_error((_Error&&)__err2);
+            return just_error(static_cast<_Error&&>(__err2));
         });
     }
 
     template <__movable_value _Error>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     auto operator()(_Error __err) const
         -> __binder_back<stopped_as_error_t, _Error>
     {
-        return {{}, {}, {(_Error&&)__err}};
+        return {{}, {}, {static_cast<_Error&&>(__err)}};
     }
 };
 } // namespace __stopped_as_xxx
@@ -4522,25 +4582,27 @@
         using __id = __operation;
 
         run_loop* __loop_;
-        STDEXEC_ATTRIBUTE((no_unique_address)) _Receiver __rcvr_;
+        STDEXEC_ATTRIBUTE((no_unique_address))
+        _Receiver __rcvr_;
 
         static void __execute_impl(__task* __p) noexcept
         {
-            auto& __rcvr = ((__t*)__p)->__rcvr_;
+            auto& __rcvr = static_cast<__t*>(__p)->__rcvr_;
             try
             {
                 if (get_stop_token(get_env(__rcvr)).stop_requested())
                 {
-                    set_stopped((_Receiver&&)__rcvr);
+                    set_stopped(static_cast<_Receiver&&>(__rcvr));
                 }
                 else
                 {
-                    set_value((_Receiver&&)__rcvr);
+                    set_value(static_cast<_Receiver&&>(__rcvr));
                 }
             }
             catch (...)
             {
-                set_error((_Receiver&&)__rcvr, std::current_exception());
+                set_error(static_cast<_Receiver&&>(__rcvr),
+                          std::current_exception());
             }
         }
 
@@ -4548,7 +4610,7 @@
 
         __t(__task* __next, run_loop* __loop, _Receiver __rcvr) :
             __task{{}, __next, {&__execute_impl}}, __loop_{__loop},
-            __rcvr_{(_Receiver&&)__rcvr}
+            __rcvr_{static_cast<_Receiver&&>(__rcvr)}
         {}
 
         friend void tag_invoke(start_t, __t& __self) noexcept
@@ -4573,7 +4635,7 @@
     {
         using __t = __scheduler;
         using __id = __scheduler;
-        bool operator==(const __scheduler&) const noexcept = default;
+        auto operator==(const __scheduler&) const noexcept -> bool = default;
 
       private:
         struct __schedule_task
@@ -4594,17 +4656,17 @@
                 stdexec::__t<__operation<stdexec::__id<_Receiver>>>;
 
             template <class _Receiver>
-            friend __operation<_Receiver>
-                tag_invoke(connect_t, const __schedule_task& __self,
-                           _Receiver __rcvr)
+            friend auto tag_invoke(connect_t, const __schedule_task& __self,
+                                   _Receiver __rcvr) -> __operation<_Receiver>
             {
-                return __self.__connect_((_Receiver&&)__rcvr);
+                return __self.__connect_(static_cast<_Receiver&&>(__rcvr));
             }
 
             template <class _Receiver>
-            __operation<_Receiver> __connect_(_Receiver&& __rcvr) const
+            auto __connect_(_Receiver&& __rcvr) const -> __operation<_Receiver>
             {
-                return {&__loop_->__head_, __loop_, (_Receiver&&)__rcvr};
+                return {&__loop_->__head_, __loop_,
+                        static_cast<_Receiver&&>(__rcvr)};
             }
 
             struct __env
@@ -4612,15 +4674,17 @@
                 run_loop* __loop_;
 
                 template <class _CPO>
-                friend __scheduler tag_invoke(get_completion_scheduler_t<_CPO>,
-                                              const __env& __self) noexcept
+                friend auto tag_invoke(get_completion_scheduler_t<_CPO>,
+                                       const __env& __self) noexcept
+                    -> __scheduler
                 {
                     return __self.__loop_->get_scheduler();
                 }
             };
 
-            friend __env tag_invoke(get_env_t,
-                                    const __schedule_task& __self) noexcept
+            friend auto tag_invoke(get_env_t,
+                                   const __schedule_task& __self) noexcept
+                -> __env
             {
                 return __env{__self.__loop_};
             }
@@ -4636,27 +4700,27 @@
 
         explicit __scheduler(run_loop* __loop) noexcept : __loop_(__loop) {}
 
-        friend __schedule_task tag_invoke(schedule_t,
-                                          const __scheduler& __self) noexcept
+        friend auto tag_invoke(schedule_t, const __scheduler& __self) noexcept
+            -> __schedule_task
         {
             return __self.__schedule();
         }
 
-        friend stdexec::forward_progress_guarantee
-            tag_invoke(get_forward_progress_guarantee_t,
-                       const __scheduler&) noexcept
+        friend auto tag_invoke(get_forward_progress_guarantee_t,
+                               const __scheduler&) noexcept
+            -> stdexec::forward_progress_guarantee
         {
             return stdexec::forward_progress_guarantee::parallel;
         }
 
         // BUGBUG NOT TO SPEC
-        friend bool tag_invoke(execute_may_block_caller_t,
-                               const __scheduler&) noexcept
+        friend auto tag_invoke(execute_may_block_caller_t,
+                               const __scheduler&) noexcept -> bool
         {
             return false;
         }
 
-        __schedule_task __schedule() const noexcept
+        [[nodiscard]] auto __schedule() const noexcept -> __schedule_task
         {
             return __schedule_task{__loop_};
         }
@@ -4664,7 +4728,7 @@
         run_loop* __loop_;
     };
 
-    __scheduler get_scheduler() noexcept
+    auto get_scheduler() noexcept -> __scheduler
     {
         return __scheduler{this};
     }
@@ -4675,7 +4739,7 @@
 
   private:
     void __push_back_(__task* __task);
-    __task* __pop_front_();
+    auto __pop_front_() -> __task*;
 
     std::mutex __mutex_;
     std::condition_variable __cv_;
@@ -4692,7 +4756,7 @@
     }
     catch (...)
     {
-        set_error((_Receiver&&)__rcvr_, std::current_exception());
+        set_error(static_cast<_Receiver&&>(__rcvr_), std::current_exception());
     }
 }
 
@@ -4719,7 +4783,7 @@
     __cv_.notify_one();
 }
 
-inline __task* run_loop::__pop_front_()
+inline auto run_loop::__pop_front_() -> __task*
 {
     std::unique_lock __lock{__mutex_};
     __cv_.wait(__lock,
@@ -4790,6 +4854,7 @@
 struct __environ
 {
     using _Scheduler = stdexec::__t<_SchedulerId>;
+
     struct __t :
         __env::__with<stdexec::__t<_SchedulerId>,
                       get_completion_scheduler_t<set_value_t>,
@@ -4828,12 +4893,12 @@
         __state_{__state}
     {}
 
-    _Receiver&& base() && noexcept
+    auto base() && noexcept -> _Receiver&&
     {
         return std::move(__state_->__receiver());
     }
 
-    const _Receiver& base() const& noexcept
+    auto base() const& noexcept -> const _Receiver&
     {
         return __state_->__receiver();
     }
@@ -4853,7 +4918,8 @@
                 __apply(
                     [&]<class... _Args>(auto __tag,
                                         _Args&... __args) noexcept -> void {
-                    __tag(std::move(__state->__receiver()), (_Args&&)__args...);
+                    __tag(std::move(__state->__receiver()),
+                          static_cast<_Args&&>(__args)...);
                 },
                     __tupl);
             }
@@ -4883,13 +4949,14 @@
 {
     template <scheduler _Scheduler, sender _Sender>
     auto operator()(_Scheduler&& __sched, _Sender&& __sndr) const
+        -> __well_formed_sender auto
     {
         using _Env = __t<__environ<__id<__decay_t<_Scheduler>>>>;
-        auto __env = _Env{{(_Scheduler&&)__sched}};
+        auto __env = _Env{{static_cast<_Scheduler&&>(__sched)}};
         auto __domain = query_or(get_domain, __sched, default_domain());
         return stdexec::transform_sender(
-            __domain,
-            __make_sexpr<schedule_from_t>(std::move(__env), (_Sender&&)__sndr));
+            __domain, __make_sexpr<schedule_from_t>(
+                          std::move(__env), static_cast<_Sender&&>(__sndr)));
     }
 
     using _Sender = __1;
@@ -4940,14 +5007,14 @@
                                                    _Args...>)
         {
             __state.__data_.template emplace<__async_result>(
-                _Tag(), (_Args&&)__args...);
+                _Tag(), static_cast<_Args&&>(__args)...);
         }
         else
         {
             try
             {
                 __state.__data_.template emplace<__async_result>(
-                    _Tag(), (_Args&&)__args...);
+                    _Tag(), static_cast<_Args&&>(__args)...);
             }
             catch (...)
             {
@@ -4987,20 +5054,22 @@
 {
     template <sender _Sender, scheduler _Scheduler>
     auto operator()(_Sender&& __sndr, _Scheduler&& __sched) const
+        -> __well_formed_sender auto
     {
         auto __domain = __get_early_domain(__sndr);
         using _Env = __t<__environ<__id<__decay_t<_Scheduler>>>>;
         return stdexec::transform_sender(
-            __domain, __make_sexpr<transfer_t>(_Env{{(_Scheduler&&)__sched}},
-                                               (_Sender&&)__sndr));
+            __domain,
+            __make_sexpr<transfer_t>(_Env{{static_cast<_Scheduler&&>(__sched)}},
+                                     static_cast<_Sender&&>(__sndr)));
     }
 
     template <scheduler _Scheduler>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     __binder_back<transfer_t, __decay_t<_Scheduler>>
         operator()(_Scheduler&& __sched) const
     {
-        return {{}, {}, {(_Scheduler&&)__sched}};
+        return {{}, {}, {static_cast<_Scheduler&&>(__sched)}};
     }
 
     //////////////////////////////////////////////////////////////////////////////////////////////
@@ -5021,14 +5090,16 @@
         return [&]<class _Data, class _Child>(__ignore, _Data&& __data,
                                               _Child&& __child) {
             auto __sched = get_completion_scheduler<set_value_t>(__data);
-            return schedule_from(std::move(__sched), (_Child&&)__child);
+            return schedule_from(std::move(__sched),
+                                 static_cast<_Child&&>(__child));
         };
     }
 
     template <class _Sender, class _Env>
     static auto transform_sender(_Sender&& __sndr, const _Env& __env)
     {
-        return __sexpr_apply((_Sender&&)__sndr, __transform_sender_fn(__env));
+        return __sexpr_apply(static_cast<_Sender&&>(__sndr),
+                             __transform_sender_fn(__env));
     }
 };
 
@@ -5059,7 +5130,7 @@
 {
     return []<class... _Ts>(
                _Ts&&... __ts) -> tag_invoke_result_t<transfer_just_t, _Ts...> {
-        return tag_invoke(transfer_just, (_Ts&&)__ts...);
+        return tag_invoke(transfer_just, static_cast<_Ts&&>(__ts)...);
     };
 }
 
@@ -5068,7 +5139,8 @@
 {
     return [&]<class _Scheduler, class... _Values>(_Scheduler&& __sched,
                                                    _Values&&... __vals) {
-        return transfer(just((_Values&&)__vals...), (_Scheduler&&)__sched);
+        return transfer(just(static_cast<_Values&&>(__vals)...),
+                        static_cast<_Scheduler&&>(__sched));
     };
 }
 
@@ -5076,7 +5148,8 @@
 auto __transform_sender_fn(const _Env& __env)
 {
     return [&]<class _Data>(__ignore, _Data&& __data) {
-        return __apply(__make_transform_fn(__env), (_Data&&)__data);
+        return __apply(__make_transform_fn(__env),
+                       static_cast<_Data&&>(__data));
     };
 }
 
@@ -5088,17 +5161,20 @@
 
     template <scheduler _Scheduler, __movable_value... _Values>
     auto operator()(_Scheduler&& __sched, _Values&&... __vals) const
+        -> __well_formed_sender auto
     {
         auto __domain = query_or(get_domain, __sched, default_domain());
         return stdexec::transform_sender(
-            __domain, __make_sexpr<transfer_just_t>(std::tuple{
-                          (_Scheduler&&)__sched, (_Values&&)__vals...}));
+            __domain, __make_sexpr<transfer_just_t>(
+                          std::tuple{static_cast<_Scheduler&&>(__sched),
+                                     static_cast<_Values&&>(__vals)...}));
     }
 
     template <class _Sender, class _Env>
     static auto transform_sender(_Sender&& __sndr, const _Env& __env)
     {
-        return __sexpr_apply((_Sender&&)__sndr, __transform_sender_fn(__env));
+        return __sexpr_apply(static_cast<_Sender&&>(__sndr),
+                             __transform_sender_fn(__env));
     }
 };
 
@@ -5137,11 +5213,11 @@
     auto operator()(_Sender&& __sndr, _Envs... __envs) const
     {
         return __make_sexpr<__write_t>(__env::__join(std::move(__envs)...),
-                                       (_Sender&&)__sndr);
+                                       static_cast<_Sender&&>(__sndr));
     }
 
     template <class... _Envs>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     auto operator()(_Envs... __envs) const -> __binder_back<__write_t, _Envs...>
     {
         return {{}, {}, {std::move(__envs)...}};
@@ -5152,14 +5228,15 @@
     static auto __transform_env_fn(_Env&& __env) noexcept
     {
         return [&](__ignore, const auto& __state, __ignore) noexcept {
-            return __env::__join(__state, (_Env&&)__env);
+            return __env::__join(__state, static_cast<_Env&&>(__env));
         };
     }
 
     template <sender_expr_for<__write_t> _Self, class _Env>
     static auto transform_env(const _Self& __self, _Env&& __env) noexcept
     {
-        return __sexpr_apply(__self, __transform_env_fn((_Env&&)__env));
+        return __sexpr_apply(__self,
+                             __transform_env_fn(static_cast<_Env&&>(__env)));
     }
 };
 
@@ -5194,14 +5271,15 @@
 STDEXEC_ATTRIBUTE((always_inline))
 auto __mkenv_sched(_Env&& __env, _Scheduler __sched)
 {
-    auto __env2 = __env::__join(__env::__with(__sched, get_scheduler),
-                                __env::__without((_Env&&)__env, get_domain));
+    auto __env2 =
+        __env::__join(__env::__with(__sched, get_scheduler),
+                      __env::__without(static_cast<_Env&&>(__env), get_domain));
     using _Env2 = decltype(__env2);
 
     struct __env_t : _Env2
     {};
 
-    return __env_t{(_Env2&&)__env2};
+    return __env_t{static_cast<_Env2&&>(__env2)};
 }
 
 template <class _Ty, class = __name_of<__decay_t<_Ty>>>
@@ -5209,7 +5287,7 @@
 {
     _Ty __val_;
 
-    _Ty operator()() noexcept
+    auto operator()() noexcept -> _Ty
     {
         return static_cast<_Ty&&>(__val_);
     }
@@ -5232,11 +5310,12 @@
 
     template <scheduler _Scheduler, sender _Sender>
     auto operator()(_Scheduler&& __sched, _Sender&& __sndr) const
+        -> __well_formed_sender auto
     {
         auto __domain = query_or(get_domain, __sched, default_domain());
         return stdexec::transform_sender(
-            __domain,
-            __make_sexpr<on_t>((_Scheduler&&)__sched, (_Sender&&)__sndr));
+            __domain, __make_sexpr<on_t>(static_cast<_Scheduler&&>(__sched),
+                                         static_cast<_Sender&&>(__sndr)));
     }
 
     template <class _Env>
@@ -5244,24 +5323,26 @@
     static auto __transform_env_fn(_Env&& __env) noexcept
     {
         return [&](__ignore, auto __sched, __ignore) noexcept {
-            return __detail::__mkenv_sched((_Env&&)__env, __sched);
+            return __detail::__mkenv_sched(static_cast<_Env&&>(__env), __sched);
         };
     }
 
     template <class _Sender, class _Env>
     static auto transform_env(const _Sender& __sndr, _Env&& __env) noexcept
     {
-        return __sexpr_apply(__sndr, __transform_env_fn((_Env&&)__env));
+        return __sexpr_apply(__sndr,
+                             __transform_env_fn(static_cast<_Env&&>(__env)));
     }
 
     template <class _Sender, class _Env>
     static auto transform_sender(_Sender&& __sndr, const _Env&)
     {
-        return __sexpr_apply((_Sender&&)__sndr,
+        return __sexpr_apply(static_cast<_Sender&&>(__sndr),
                              []<class _Data, class _Child>(
                                  __ignore, _Data&& __data, _Child&& __child) {
-            return let_value(schedule(__data),
-                             __detail::__always{(_Child&&)__child});
+            return let_value(
+                schedule(__data),
+                __detail::__always{static_cast<_Child&&>(__child)});
         });
     }
 };
@@ -5296,7 +5377,7 @@
 struct into_variant_t
 {
     template <sender _Sender>
-    auto operator()(_Sender&& __sndr) const
+    auto operator()(_Sender&& __sndr) const -> __well_formed_sender auto
     {
         auto __domain = __get_early_domain(__sndr);
         return stdexec::transform_sender(
@@ -5304,7 +5385,8 @@
             __make_sexpr<into_variant_t>(__(), std::forward<_Sender>(__sndr)));
     }
 
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
+
     auto operator()() const noexcept
     {
         return __binder_back<into_variant_t>{};
@@ -5329,18 +5411,20 @@
             using __variant_t = __t<_State>;
             try
             {
-                set_value(
-                    (_Receiver&&)__rcvr,
-                    __variant_t{std::tuple<_Args&&...>{(_Args&&)__args...}});
+                set_value(static_cast<_Receiver&&>(__rcvr),
+                          __variant_t{std::tuple<_Args&&...>{
+                              static_cast<_Args&&>(__args)...}});
             }
             catch (...)
             {
-                set_error((_Receiver&&)__rcvr, std::current_exception());
+                set_error(static_cast<_Receiver&&>(__rcvr),
+                          std::current_exception());
             }
         }
         else
         {
-            _Tag()((_Receiver&&)__rcvr, (_Args&&)__args...);
+            _Tag()(static_cast<_Receiver&&>(__rcvr),
+                   static_cast<_Args&&>(__args)...);
         }
     };
 
@@ -5387,7 +5471,7 @@
 {
     return __env::__join(
         __env::__with(__stop_source.get_token(), get_stop_token),
-        (_Env&&)__env);
+        static_cast<_Env&&>(__env));
 }
 
 template <class _Env>
@@ -5464,7 +5548,7 @@
 struct __tie_fn
 {
     template <class... _Ty>
-    std::tuple<_Ty&...> operator()(_Ty&... __vals) noexcept
+    auto operator()(_Ty&... __vals) noexcept -> std::tuple<_Ty&...>
     {
         return std::tuple<_Ty&...>{__vals...};
     }
@@ -5476,7 +5560,8 @@
     return [&]<class... _Ts>(_Ts&... __ts) noexcept {
         if constexpr (!same_as<__types<_Ts...>, __types<__not_an_error>>)
         {
-            _Tag()((_Receiver&&)__rcvr, (_Ts&&)__ts...);
+            _Tag()(static_cast<_Receiver&&>(__rcvr),
+                   static_cast<_Ts&&>(__ts)...);
         }
     };
 }
@@ -5484,19 +5569,21 @@
 template <class _Receiver, class _ValuesTuple>
 void __set_values(_Receiver& __rcvr, _ValuesTuple& __values) noexcept
 {
-    __apply(
+    __tup::__apply(
         [&](auto&... __opt_vals) noexcept -> void {
         __apply(__complete_fn(set_value, __rcvr), //
-                std::tuple_cat(__apply(__tie_fn{}, *__opt_vals)...));
+                std::tuple_cat(__tup::__apply(__tie_fn{}, *__opt_vals)...));
     },
         __values);
 }
 
+template <class... Ts>
+using __decayed_custom_tuple = __tup::__tuple_for<__decay_t<Ts>...>;
+
 template <class _Env, class _Sender>
 using __values_opt_tuple_t = //
-    __value_types_of_t<_Sender, __env_t<_Env>,
-                       __mcompose<__q<std::optional>, __q<__decayed_tuple>>,
-                       __q<__msingle>>;
+    value_types_of_t<_Sender, __env_t<_Env>, __decayed_custom_tuple,
+                     std::optional>;
 
 template <class _Env, __max1_sender<__env_t<_Env>>... _Senders>
 struct __traits
@@ -5505,7 +5592,7 @@
     using __values_tuple = //
         __minvoke<__with_default<
                       __transform<__mbind_front_q<__values_opt_tuple_t, _Env>,
-                                  __q<std::tuple>>,
+                                  __q<__tup::__tuple_for>>,
                       __ignore>,
                   _Senders...>;
 
@@ -5564,7 +5651,7 @@
                 }
                 break;
             case __stopped:
-                stdexec::set_stopped((_Receiver&&)__rcvr);
+                stdexec::set_stopped(static_cast<_Receiver&&>(__rcvr));
                 break;
             default:;
         }
@@ -5575,7 +5662,8 @@
     // Could be non-atomic here and atomic_ref everywhere except __completion_fn
     std::atomic<__state_t> __state_{__started};
     _ErrorsVariant __errors_{};
-    STDEXEC_ATTRIBUTE((no_unique_address)) _ValuesTuple __values_{};
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _ValuesTuple __values_{};
     std::optional<__stop_callback_t> __on_stop_{};
 };
 
@@ -5604,14 +5692,14 @@
     using __legacy_customizations_t = //
         __types<tag_invoke_t(when_all_t, _Sender...)>;
 
-    // TODO: improve diagnostic when senders have different domains
     template <sender... _Senders>
         requires __domain::__has_common_domain<_Senders...>
-    auto operator()(_Senders&&... __sndrs) const
+    auto operator()(_Senders&&... __sndrs) const -> __well_formed_sender auto
     {
         auto __domain = __domain::__common_domain_t<_Senders...>();
         return stdexec::transform_sender(
-            __domain, __make_sexpr<when_all_t>(__(), (_Senders&&)__sndrs...));
+            __domain, __make_sexpr<when_all_t>(
+                          __(), static_cast<_Senders&&>(__sndrs)...));
     }
 };
 
@@ -5637,7 +5725,6 @@
         {
             return __env::__with(_Domain(), get_domain);
         }
-        STDEXEC_UNREACHABLE();
     };
 
     static constexpr auto get_completion_signatures = //
@@ -5657,8 +5744,9 @@
     static constexpr auto get_state = //
         []<class _Self, class _Receiver>(_Self&& __self, _Receiver& __rcvr)
         -> __sexpr_apply_result_t<_Self, __mk_state_fn_t<env_of_t<_Receiver>>> {
-        return __sexpr_apply((_Self&&)__self, __when_all::__mk_state_fn(
-                                                  stdexec::get_env(__rcvr)));
+        return __sexpr_apply(
+            static_cast<_Self&&>(__self),
+            __when_all::__mk_state_fn(stdexec::get_env(__rcvr)));
     };
 
     static constexpr auto start = //
@@ -5697,14 +5785,14 @@
             if constexpr (__nothrow_decay_copyable<_Error>)
             {
                 __state.__errors_.template emplace<__decay_t<_Error>>(
-                    (_Error&&)__err);
+                    static_cast<_Error&&>(__err));
             }
             else
             {
                 try
                 {
                     __state.__errors_.template emplace<__decay_t<_Error>>(
-                        (_Error&&)__err);
+                        static_cast<_Error&&>(__err));
                 }
                 catch (...)
                 {
@@ -5721,7 +5809,7 @@
                            _Args&&... __args) noexcept -> void {
         if constexpr (same_as<_Set, set_error_t>)
         {
-            __set_error(__state, __rcvr, (_Args&&)__args...);
+            __set_error(__state, __rcvr, static_cast<_Args&&>(__args)...);
         }
         else if constexpr (same_as<_Set, set_stopped_t>)
         {
@@ -5740,20 +5828,23 @@
             // if we're not already in the "error" or "stopped" state.
             if (__state.__state_ == __started)
             {
-                auto& __opt_values = std::get<__v<_Index>>(__state.__values_);
+                auto& __opt_values =
+                    __tup::__get<__v<_Index>>(__state.__values_);
+                using _Tuple = __decayed_custom_tuple<_Args...>;
                 static_assert(
-                    same_as<decltype(*__opt_values),
-                            __decayed_tuple<_Args...>&>,
+                    same_as<decltype(*__opt_values), _Tuple&>,
                     "One of the senders in this when_all() is fibbing about what types it sends");
                 if constexpr ((__nothrow_decay_copyable<_Args> && ...))
                 {
-                    __opt_values.emplace((_Args&&)__args...);
+                    __opt_values.emplace(
+                        _Tuple{{static_cast<_Args&&>(__args)}...});
                 }
                 else
                 {
                     try
                     {
-                        __opt_values.emplace((_Args&&)__args...);
+                        __opt_values.emplace(
+                            _Tuple{{static_cast<_Args&&>(__args)}...});
                     }
                     catch (...)
                     {
@@ -5775,12 +5866,12 @@
 
     template <sender... _Senders>
         requires __domain::__has_common_domain<_Senders...>
-    auto operator()(_Senders&&... __sndrs) const
+    auto operator()(_Senders&&... __sndrs) const -> __well_formed_sender auto
     {
         auto __domain = __domain::__common_domain_t<_Senders...>();
-        return stdexec::transform_sender(__domain,
-                                         __make_sexpr<when_all_with_variant_t>(
-                                             __(), (_Senders&&)__sndrs...));
+        return stdexec::transform_sender(
+            __domain, __make_sexpr<when_all_with_variant_t>(
+                          __(), static_cast<_Senders&&>(__sndrs)...));
     }
 
     template <class _Sender, class _Env>
@@ -5790,9 +5881,10 @@
         // for early when_all customizations), then transform it again to look
         // for late customizations.
         return __sexpr_apply(
-            (_Sender&&)__sndr,
+            static_cast<_Sender&&>(__sndr),
             [&]<class... _Child>(__ignore, __ignore, _Child&&... __child) {
-            return when_all_t()(into_variant((_Child&&)__child)...);
+            return when_all_t()(
+                into_variant(static_cast<_Child&&>(__child))...);
         });
     }
 };
@@ -5810,7 +5902,6 @@
         {
             return __env::__with(_Domain(), get_domain);
         }
-        STDEXEC_UNREACHABLE();
     };
 };
 
@@ -5826,13 +5917,15 @@
     template <scheduler _Scheduler, sender... _Senders>
         requires __domain::__has_common_domain<_Senders...>
     auto operator()(_Scheduler&& __sched, _Senders&&... __sndrs) const
+        -> __well_formed_sender auto
     {
         using _Env =
             __t<__schedule_from::__environ<__id<__decay_t<_Scheduler>>>>;
         auto __domain = query_or(get_domain, __sched, default_domain());
         return stdexec::transform_sender(
             __domain, __make_sexpr<transfer_when_all_t>(
-                          _Env{(_Scheduler&&)__sched}, (_Senders&&)__sndrs...));
+                          _Env{static_cast<_Scheduler&&>(__sched)},
+                          static_cast<_Senders&&>(__sndrs)...));
     }
 
     template <class _Sender, class _Env>
@@ -5842,10 +5935,10 @@
         // (looking for early customizations), then transform it again to look
         // for late customizations.
         return __sexpr_apply(
-            (_Sender&&)__sndr,
+            static_cast<_Sender&&>(__sndr),
             [&]<class _Data, class... _Child>(__ignore, _Data&& __data,
                                               _Child&&... __child) {
-            return transfer(when_all_t()((_Child&&)__child...),
+            return transfer(when_all_t()(static_cast<_Child&&>(__child)...),
                             get_completion_scheduler<set_value_t>(__data));
         });
     }
@@ -5872,14 +5965,15 @@
     template <scheduler _Scheduler, sender... _Senders>
         requires __domain::__has_common_domain<_Senders...>
     auto operator()(_Scheduler&& __sched, _Senders&&... __sndrs) const
+        -> __well_formed_sender auto
     {
         using _Env =
             __t<__schedule_from::__environ<__id<__decay_t<_Scheduler>>>>;
         auto __domain = query_or(get_domain, __sched, default_domain());
         return stdexec::transform_sender(
-            __domain,
-            __make_sexpr<transfer_when_all_with_variant_t>(
-                _Env{{(_Scheduler&&)__sched}}, (_Senders&&)__sndrs...));
+            __domain, __make_sexpr<transfer_when_all_with_variant_t>(
+                          _Env{{static_cast<_Scheduler&&>(__sched)}},
+                          static_cast<_Senders&&>(__sndrs)...));
     }
 
     template <class _Sender, class _Env>
@@ -5890,12 +5984,13 @@
         // customizations), then transform it again to look for late
         // customizations.
         return __sexpr_apply(
-            (_Sender&&)__sndr,
+            static_cast<_Sender&&>(__sndr),
             [&]<class _Data, class... _Child>(__ignore, _Data&& __data,
                                               _Child&&... __child) {
             return transfer_when_all_t()(
-                get_completion_scheduler<set_value_t>((_Data&&)__data),
-                into_variant((_Child&&)__child)...);
+                get_completion_scheduler<set_value_t>(
+                    static_cast<_Data&&>(__data)),
+                into_variant(static_cast<_Child&&>(__child))...);
         });
     }
 };
@@ -5997,6 +6092,8 @@
 
 struct __read_impl : __sexpr_defaults
 {
+    using is_dependent = void;
+
     template <class _Tag, class _Env>
     using __completions_t = __minvoke<
         __mtry_catch_q<__read::__completions_t, __q<__query_failed_error>>,
@@ -6053,6 +6150,7 @@
 
 namespace __queries
 {
+template <class _Tag>
 inline auto get_scheduler_t::operator()() const noexcept
 {
     return read(get_scheduler);
@@ -6068,6 +6166,7 @@
     return tag_invoke(get_scheduler_t{}, __env);
 }
 
+template <class _Tag>
 inline auto get_delegatee_scheduler_t::operator()() const noexcept
 {
     return read(get_delegatee_scheduler);
@@ -6086,11 +6185,13 @@
     return tag_invoke(get_delegatee_scheduler_t{}, std::as_const(__t));
 }
 
+template <class _Tag>
 inline auto get_allocator_t::operator()() const noexcept
 {
     return read(get_allocator);
 }
 
+template <class _Tag>
 inline auto get_stop_token_t::operator()() const noexcept
 {
     return read(get_stop_token);
@@ -6158,12 +6259,13 @@
 {
     template <scheduler _Scheduler, sender _Sender>
     auto operator()(_Scheduler&& __sched, _Sender&& __sndr) const
+        -> __well_formed_sender auto
     {
         // BUGBUG __get_early_domain, or get_domain(__sched), or ...?
         auto __domain = __get_early_domain(__sndr);
         return stdexec::transform_sender(
-            __domain,
-            __make_sexpr<on_t>((_Scheduler&&)__sched, (_Sender&&)__sndr));
+            __domain, __make_sexpr<on_t>(static_cast<_Scheduler&&>(__sched),
+                                         static_cast<_Sender&&>(__sndr)));
     }
 
     template <class _Env>
@@ -6171,14 +6273,15 @@
     static auto __transform_env_fn(_Env&& __env) noexcept
     {
         return [&](__ignore, auto __sched, __ignore) noexcept {
-            return __detail::__mkenv_sched((_Env&&)__env, __sched);
+            return __detail::__mkenv_sched(static_cast<_Env&&>(__env), __sched);
         };
     }
 
     template <class _Sender, class _Env>
     static auto transform_env(const _Sender& __sndr, _Env&& __env) noexcept
     {
-        return __sexpr_apply(__sndr, __transform_env_fn((_Env&&)__env));
+        return __sexpr_apply(__sndr,
+                             __transform_env_fn(static_cast<_Env&&>(__env)));
     }
 
     using __no_scheduler_in_environment::transform_sender;
@@ -6188,13 +6291,14 @@
     static auto transform_sender(_Sender&& __sndr, const _Env& __env)
     {
         return __sexpr_apply(
-            (_Sender&&)__sndr,
+            static_cast<_Sender&&>(__sndr),
             [&]<class _Scheduler, class _Child>(__ignore, _Scheduler __sched,
                                                 _Child&& __child) {
             auto __old = get_scheduler(__env);
-            return transfer(let_value(transfer_just(std::move(__sched)),
-                                      __detail::__always{(_Child&&)__child}),
-                            std::move(__old));
+            return transfer(
+                let_value(transfer_just(std::move(__sched)),
+                          __detail::__always{static_cast<_Child&&>(__child)}),
+                std::move(__old));
         });
     }
 };
@@ -6214,8 +6318,8 @@
 {
     _Scheduler __sched_;
 
-    friend _Scheduler tag_invoke(get_scheduler_t,
-                                 const __with_sched& __self) noexcept
+    friend auto tag_invoke(get_scheduler_t, const __with_sched& __self) noexcept
+        -> _Scheduler
     {
         return __self.__sched_;
     }
@@ -6234,23 +6338,26 @@
     template <sender _Sender, scheduler _Scheduler,
               __sender_adaptor_closure_for<_Sender> _Closure>
     auto operator()(_Sender&& __sndr, _Scheduler&& __sched,
-                    _Closure&& __clsur) const
+                    _Closure&& __clsur) const -> __well_formed_sender auto
     {
         auto __domain = __get_early_domain(__sndr);
         return stdexec::transform_sender(
-            __domain,
-            __make_sexpr<continue_on_t>(
-                __continue_on_data{(_Scheduler&&)__sched, (_Closure&&)__clsur},
-                (_Sender&&)__sndr));
+            __domain, __make_sexpr<continue_on_t>(
+                          __continue_on_data{static_cast<_Scheduler&&>(__sched),
+                                             static_cast<_Closure&&>(__clsur)},
+                          static_cast<_Sender&&>(__sndr)));
     }
 
     template <scheduler _Scheduler, __sender_adaptor_closure _Closure>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     auto operator()(_Scheduler&& __sched, _Closure&& __clsur) const
         -> __binder_back<continue_on_t, __decay_t<_Scheduler>,
                          __decay_t<_Closure>>
     {
-        return {{}, {}, {(_Scheduler&&)__sched, (_Closure&&)__clsur}};
+        return {{},
+                {},
+                {static_cast<_Scheduler&&>(__sched),
+                 static_cast<_Closure&&>(__clsur)}};
     }
 
     using __no_scheduler_in_environment::transform_sender;
@@ -6260,17 +6367,17 @@
     static auto transform_sender(_Sender&& __sndr, const _Env& __env)
     {
         auto __old = get_scheduler(__env);
-        return __sexpr_apply((_Sender&&)__sndr,
+        return __sexpr_apply(static_cast<_Sender&&>(__sndr),
                              [&]<class _Data, class _Child>(
                                  __ignore, _Data&& __data, _Child&& __child) {
-            auto&& [__sched, __clsur] = (_Data&&)__data;
+            auto&& [__sched, __clsur] = static_cast<_Data&&>(__data);
             using _Closure = decltype(__clsur);
-            return __write(
-                transfer(((_Closure&&)__clsur)(transfer(
-                             __write((_Child&&)__child, __with_sched{__old}),
-                             __sched)),
-                         __old),
-                __with_sched{__sched});
+            return __write(transfer(static_cast<_Closure&&>(__clsur)(transfer(
+                                        __write(static_cast<_Child&&>(__child),
+                                                __with_sched{__old}),
+                                        __sched)),
+                                    __old),
+                           __with_sched{__sched});
         });
     }
 };
@@ -6285,6 +6392,18 @@
 inline constexpr continue_on_t continue_on{};
 } // namespace v2
 
+template <>
+struct __sexpr_impl<v2::on_t> : __sexpr_defaults
+{
+    using is_dependent = void;
+};
+
+template <>
+struct __sexpr_impl<v2::continue_on_t> : __sexpr_defaults
+{
+    using is_dependent = void;
+};
+
 /////////////////////////////////////////////////////////////////////////////
 // [execution.senders.consumers.sync_wait]
 // [execution.senders.consumers.sync_wait_with_variant]
@@ -6343,13 +6462,14 @@
         void __set_error(_Error __err) noexcept
         {
             if constexpr (__decays_to<_Error, std::exception_ptr>)
-                __state_->__data_.template emplace<2>((_Error&&)__err);
+                __state_->__data_.template emplace<2>(
+                    static_cast<_Error&&>(__err));
             else if constexpr (__decays_to<_Error, std::error_code>)
                 __state_->__data_.template emplace<2>(
                     std::make_exception_ptr(std::system_error(__err)));
             else
                 __state_->__data_.template emplace<2>(
-                    std::make_exception_ptr((_Error&&)__err));
+                    std::make_exception_ptr(static_cast<_Error&&>(__err)));
             __loop_->finish();
         }
 
@@ -6359,7 +6479,8 @@
         {
             try
             {
-                __rcvr.__state_->__data_.template emplace<1>((_As&&)__as...);
+                __rcvr.__state_->__data_.template emplace<1>(
+                    static_cast<_As&&>(__as)...);
                 __rcvr.__loop_->finish();
             }
             catch (...)
@@ -6371,7 +6492,7 @@
         template <same_as<set_error_t> _Tag, class _Error>
         friend void tag_invoke(_Tag, __t&& __rcvr, _Error __err) noexcept
         {
-            __rcvr.__set_error((_Error&&)__err);
+            __rcvr.__set_error(static_cast<_Error&&>(__err));
         }
 
         friend void tag_invoke(set_stopped_t __d, __t&& __rcvr) noexcept
@@ -6380,7 +6501,7 @@
             __rcvr.__loop_->finish();
         }
 
-        friend __env tag_invoke(get_env_t, const __t& __rcvr) noexcept
+        friend auto tag_invoke(get_env_t, const __t& __rcvr) noexcept -> __env
         {
             return __env(*__rcvr.__loop_);
         }
@@ -6480,7 +6601,6 @@
         constexpr __mstring __diag = "Unknown concept check failure."_mstr;
         return __sync_wait_error<__diag, _Sender>();
     }
-    STDEXEC_UNREACHABLE();
 }
 
 template <class _Sender>
@@ -6500,7 +6620,8 @@
         -> std::optional<__value_tuple_for_t<_Sender>>
     {
         auto __domain = __get_early_domain(__sndr);
-        return stdexec::apply_sender(__domain, *this, (_Sender&&)__sndr);
+        return stdexec::apply_sender(__domain, *this,
+                                     static_cast<_Sender&&>(__sndr));
     }
 
 #if STDEXEC_NVHPC()
@@ -6531,7 +6652,7 @@
 
         // Launch the sender with a continuation that will fill in a variant
         // and notify a condition variable.
-        auto __op_state = connect((_Sender&&)__sndr,
+        auto __op_state = connect(static_cast<_Sender&&>(__sndr),
                                   __receiver_t<_Sender>{&__state, &__loop});
         start(__op_state);
 
@@ -6561,7 +6682,8 @@
         -> std::optional<__variant_for_t<_Sender>>
     {
         auto __domain = __get_early_domain(__sndr);
-        return stdexec::apply_sender(__domain, *this, (_Sender&&)__sndr);
+        return stdexec::apply_sender(__domain, *this,
+                                     static_cast<_Sender&&>(__sndr));
     }
 
 #if STDEXEC_NVHPC()
@@ -6585,7 +6707,8 @@
     auto apply_sender(_Sender&& __sndr) const
         -> std::optional<__variant_for_t<_Sender>>
     {
-        if (auto __opt_values = sync_wait_t()(into_variant((_Sender&&)__sndr)))
+        if (auto __opt_values =
+                sync_wait_t()(into_variant(static_cast<_Sender&&>(__sndr))))
         {
             return std::move(std::get<0>(*__opt_values));
         }
diff --git a/include/sdbusplus/async/stdexec/functional.hpp b/include/sdbusplus/async/stdexec/functional.hpp
index a19719c..3b4c989 100644
--- a/include/sdbusplus/async/stdexec/functional.hpp
+++ b/include/sdbusplus/async/stdexec/functional.hpp
@@ -32,7 +32,7 @@
 template <class _Fun, class... _As>
 concept invocable = //
     requires(_Fun&& __f, _As&&... __as) {
-        std::invoke((_Fun&&)__f, (_As&&)__as...);
+        std::invoke(static_cast<_Fun&&>(__f), static_cast<_As&&>(__as)...);
     };
 #endif
 } // namespace stdexec::__std_concepts
@@ -40,7 +40,7 @@
 namespace std
 {
 using namespace stdexec::__std_concepts;
-}
+} // namespace std
 
 namespace stdexec
 {
@@ -51,13 +51,11 @@
 
     template <class... _Args>
         requires __callable<_FunT, _Args...>
-    STDEXEC_ATTRIBUTE((always_inline)) //
-        auto
-        operator()(_Args&&... __args) const
-        noexcept(noexcept(_Fun((_Args&&)__args...)))
-            -> decltype(_Fun((_Args&&)__args...))
+    STDEXEC_ATTRIBUTE((always_inline)) auto operator()(_Args&&... __args) const
+        noexcept(noexcept(_Fun(static_cast<_Args&&>(__args)...)))
+            -> decltype(_Fun(static_cast<_Args&&>(__args)...))
     {
-        return _Fun((_Args&&)__args...);
+        return _Fun(static_cast<_Args&&>(__args)...);
     }
 };
 
@@ -67,13 +65,12 @@
     using _FunT = _Ty _Cl::*;
 
     template <class _Arg>
-        requires requires(_Arg&& __arg) { ((_Arg&&)__arg).*_MemPtr; }
-    STDEXEC_ATTRIBUTE((always_inline)) //
-        constexpr auto
+        requires requires(_Arg&& __arg) { static_cast<_Arg&&>(__arg).*_MemPtr; }
+    STDEXEC_ATTRIBUTE((always_inline)) constexpr auto
         operator()(_Arg&& __arg) const noexcept
-        -> decltype((((_Arg&&)__arg).*_MemPtr))
+        -> decltype(((static_cast<_Arg&&>(__arg)).*_MemPtr))
     {
-        return ((_Arg&&)__arg).*_MemPtr;
+        return static_cast<_Arg&&>(__arg).*_MemPtr;
     }
 };
 
@@ -83,37 +80,40 @@
 template <class _Fun0, class _Fun1>
 struct __composed
 {
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Fun0 __t0_;
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Fun1 __t1_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Fun0 __t0_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Fun1 __t1_;
 
     template <class... _Ts>
         requires __callable<_Fun1, _Ts...> &&
                  __callable<_Fun0, __call_result_t<_Fun1, _Ts...>>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
         __call_result_t<_Fun0, __call_result_t<_Fun1, _Ts...>>
         operator()(_Ts&&... __ts) &&
     {
-        return ((_Fun0&&)__t0_)(((_Fun1&&)__t1_)((_Ts&&)__ts...));
+        return static_cast<_Fun0&&>(__t0_)(
+            static_cast<_Fun1&&>(__t1_)(static_cast<_Ts&&>(__ts)...));
     }
 
     template <class... _Ts>
         requires __callable<const _Fun1&, _Ts...> &&
                  __callable<const _Fun0&, __call_result_t<const _Fun1&, _Ts...>>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
         __call_result_t<_Fun0, __call_result_t<_Fun1, _Ts...>>
         operator()(_Ts&&... __ts) const&
     {
-        return __t0_(__t1_((_Ts&&)__ts...));
+        return __t0_(__t1_(static_cast<_Ts&&>(__ts)...));
     }
 };
 
 inline constexpr struct __compose_t
 {
     template <class _Fun0, class _Fun1>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     __composed<_Fun0, _Fun1> operator()(_Fun0 __fun0, _Fun1 __fun1) const
     {
-        return {(_Fun0&&)__fun0, (_Fun1&&)__fun1};
+        return {static_cast<_Fun0&&>(__fun0), static_cast<_Fun1&&>(__fun1)};
     }
 } __compose{};
 
@@ -127,70 +127,79 @@
 struct __funobj
 {
     template <class _Fun, class... _Args>
-    STDEXEC_ATTRIBUTE((always_inline)) //
-    constexpr auto operator()(_Fun&& __fun, _Args&&... __args) const
-        noexcept(noexcept(((_Fun&&)__fun)((_Args&&)__args...)))
-            -> decltype(((_Fun&&)__fun)((_Args&&)__args...))
+    STDEXEC_ATTRIBUTE((always_inline))
+    constexpr auto operator()(_Fun&& __fun, _Args&&... __args) const noexcept(
+        noexcept((static_cast<_Fun&&>(__fun))(static_cast<_Args&&>(__args)...)))
+        -> decltype((static_cast<_Fun&&>(__fun))(
+            static_cast<_Args&&>(__args)...))
     {
-        return ((_Fun&&)__fun)((_Args&&)__args...);
+        return static_cast<_Fun&&>(__fun)(static_cast<_Args&&>(__args)...);
     }
 };
 
 struct __memfn
 {
     template <class _Memptr, class _Ty, class... _Args>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     constexpr auto operator()(_Memptr __mem_ptr, _Ty&& __ty,
                               _Args&&... __args) const
-        noexcept(noexcept((((_Ty&&)__ty).*__mem_ptr)((_Args&&)__args...)))
-            -> decltype((((_Ty&&)__ty).*__mem_ptr)((_Args&&)__args...))
+        noexcept(noexcept(((static_cast<_Ty&&>(__ty)).*
+                           __mem_ptr)(static_cast<_Args&&>(__args)...)))
+            -> decltype(((static_cast<_Ty&&>(__ty)).*
+                         __mem_ptr)(static_cast<_Args&&>(__args)...))
     {
-        return (((_Ty&&)__ty).*__mem_ptr)((_Args&&)__args...);
+        return ((static_cast<_Ty&&>(__ty)).*
+                __mem_ptr)(static_cast<_Args&&>(__args)...);
     }
 };
 
 struct __memfn_refwrap
 {
     template <class _Memptr, class _Ty, class... _Args>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     constexpr auto operator()(_Memptr __mem_ptr, _Ty __ty,
                               _Args&&... __args) const
-        noexcept(noexcept((__ty.get().*__mem_ptr)((_Args&&)__args...)))
-            -> decltype((__ty.get().*__mem_ptr)((_Args&&)__args...))
+        noexcept(noexcept((__ty.get().*
+                           __mem_ptr)(static_cast<_Args&&>(__args)...)))
+            -> decltype((__ty.get().*
+                         __mem_ptr)(static_cast<_Args&&>(__args)...))
     {
-        return (__ty.get().*__mem_ptr)((_Args&&)__args...);
+        return (__ty.get().*__mem_ptr)(static_cast<_Args&&>(__args)...);
     }
 };
 
 struct __memfn_smartptr
 {
     template <class _Memptr, class _Ty, class... _Args>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     constexpr auto operator()(_Memptr __mem_ptr, _Ty&& __ty,
                               _Args&&... __args) const
-        noexcept(noexcept(((*(_Ty&&)__ty).*__mem_ptr)((_Args&&)__args...)))
-            -> decltype(((*(_Ty&&)__ty).*__mem_ptr)((_Args&&)__args...))
+        noexcept(noexcept(((*static_cast<_Ty&&>(__ty)).*
+                           __mem_ptr)(static_cast<_Args&&>(__args)...)))
+            -> decltype(((*static_cast<_Ty&&>(__ty)).*
+                         __mem_ptr)(static_cast<_Args&&>(__args)...))
     {
-        return ((*(_Ty&&)__ty).*__mem_ptr)((_Args&&)__args...);
+        return ((*static_cast<_Ty&&>(__ty)).*
+                __mem_ptr)(static_cast<_Args&&>(__args)...);
     }
 };
 
 struct __memobj
 {
     template <class _Mbr, class _Class, class _Ty>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     constexpr auto operator()(_Mbr _Class::*__mem_ptr,
                               _Ty&& __ty) const noexcept
-        -> decltype((((_Ty&&)__ty).*__mem_ptr))
+        -> decltype(((static_cast<_Ty&&>(__ty)).*__mem_ptr))
     {
-        return (((_Ty&&)__ty).*__mem_ptr);
+        return ((static_cast<_Ty&&>(__ty)).*__mem_ptr);
     }
 };
 
 struct __memobj_refwrap
 {
     template <class _Mbr, class _Class, class _Ty>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     constexpr auto operator()(_Mbr _Class::*__mem_ptr, _Ty __ty) const noexcept
         -> decltype((__ty.get().*__mem_ptr))
     {
@@ -201,16 +210,16 @@
 struct __memobj_smartptr
 {
     template <class _Mbr, class _Class, class _Ty>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     constexpr auto operator()(_Mbr _Class::*__mem_ptr,
                               _Ty&& __ty) const noexcept
-        -> decltype(((*(_Ty&&)__ty).*__mem_ptr))
+        -> decltype(((*static_cast<_Ty&&>(__ty)).*__mem_ptr))
     {
-        return ((*(_Ty&&)__ty).*__mem_ptr);
+        return ((*static_cast<_Ty&&>(__ty)).*__mem_ptr);
     }
 };
 
-__funobj __invoke_selector(__ignore, __ignore) noexcept;
+auto __invoke_selector(__ignore, __ignore) noexcept -> __funobj;
 
 template <class _Mbr, class _Class, class _Ty>
 auto __invoke_selector(_Mbr _Class::*, const _Ty&) noexcept
@@ -252,25 +261,27 @@
 struct __invoke_t
 {
     template <class _Fun>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     constexpr auto operator()(_Fun&& __fun) const
-        noexcept(noexcept(((_Fun&&)__fun)())) -> decltype(((_Fun&&)__fun)())
+        noexcept(noexcept((static_cast<_Fun&&>(__fun))()))
+            -> decltype((static_cast<_Fun&&>(__fun))())
     {
-        return ((_Fun&&)__fun)();
+        return static_cast<_Fun&&>(__fun)();
     }
 
     template <class _Fun, class _Ty, class... _Args>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     constexpr auto operator()(_Fun&& __fun, _Ty&& __ty, _Args&&... __args) const
-        noexcept(noexcept(__invoke_selector(__fun, __ty)((_Fun&&)__fun,
-                                                         (_Ty&&)__ty,
-                                                         (_Args&&)__args...)))
-            -> decltype(__invoke_selector(__fun, __ty)((_Fun&&)__fun,
-                                                       (_Ty&&)__ty,
-                                                       (_Args&&)__args...))
+        noexcept(noexcept(__invoke_selector(__fun, __ty)(
+            static_cast<_Fun&&>(__fun), static_cast<_Ty&&>(__ty),
+            static_cast<_Args&&>(__args)...)))
+            -> decltype(__invoke_selector(__fun, __ty)(
+                static_cast<_Fun&&>(__fun), static_cast<_Ty&&>(__ty),
+                static_cast<_Args&&>(__args)...))
     {
         return decltype(__invoke_selector(__fun, __ty))()(
-            (_Fun&&)__fun, (_Ty&&)__ty, (_Args&&)__args...);
+            static_cast<_Fun&&>(__fun), static_cast<_Ty&&>(__ty),
+            static_cast<_Args&&>(__args)...);
     }
 };
 } // namespace __invoke_
@@ -280,7 +291,7 @@
 template <class _Fun, class... _As>
 concept __invocable = //
     requires(_Fun&& __f, _As&&... __as) {
-        __invoke((_Fun&&)__f, (_As&&)__as...);
+        __invoke(static_cast<_Fun&&>(__f), static_cast<_As&&>(__as)...);
     };
 
 template <class _Fun, class... _As>
@@ -288,7 +299,7 @@
     __invocable<_Fun, _As...> && //
     requires(_Fun&& __f, _As&&... __as) {
         {
-            __invoke((_Fun&&)__f, (_As&&)__as...)
+            __invoke(static_cast<_Fun&&>(__f), static_cast<_As&&>(__as)...)
         } noexcept;
     };
 
@@ -301,12 +312,15 @@
 using std::get;
 
 template <std::size_t... _Is, class _Fn, class _Tup>
-STDEXEC_ATTRIBUTE((always_inline)) //
+STDEXEC_ATTRIBUTE((always_inline))
 constexpr auto __impl(__indices<_Is...>, _Fn&& __fn, _Tup&& __tup) noexcept(
-    noexcept(__invoke((_Fn&&)__fn, get<_Is>((_Tup&&)__tup)...)))
-    -> decltype(__invoke((_Fn&&)__fn, get<_Is>((_Tup&&)__tup)...))
+    noexcept(__invoke(static_cast<_Fn&&>(__fn),
+                      get<_Is>(static_cast<_Tup&&>(__tup))...)))
+    -> decltype(__invoke(static_cast<_Fn&&>(__fn),
+                         get<_Is>(static_cast<_Tup&&>(__tup))...))
 {
-    return __invoke((_Fn&&)__fn, get<_Is>((_Tup&&)__tup)...);
+    return __invoke(static_cast<_Fn&&>(__fn),
+                    get<_Is>(static_cast<_Tup&&>(__tup))...);
 }
 
 template <class _Tup>
@@ -334,13 +348,13 @@
 {
     template <class _Fn, class _Tup>
         requires __applicable<_Fn, _Tup>
-    STDEXEC_ATTRIBUTE((always_inline)) //
-        constexpr auto
+    STDEXEC_ATTRIBUTE((always_inline)) constexpr auto
         operator()(_Fn&& __fn, _Tup&& __tup) const
         noexcept(__nothrow_applicable<_Fn, _Tup>) -> __apply_result_t<_Fn, _Tup>
     {
-        return __apply_::__impl(__apply_::__tuple_indices<_Tup>(), (_Fn&&)__fn,
-                                (_Tup&&)__tup);
+        return __apply_::__impl(__apply_::__tuple_indices<_Tup>(),
+                                static_cast<_Fn&&>(__fn),
+                                static_cast<_Tup&&>(__tup));
     }
 };
 
@@ -349,7 +363,7 @@
 template <class _Tag, class _Ty>
 struct __field
 {
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     _Ty operator()(_Tag) const noexcept(__nothrow_decay_copyable<const _Ty&>)
     {
         return __t_;
@@ -362,11 +376,11 @@
 struct __mkfield_
 {
     template <class _Ty>
-    STDEXEC_ATTRIBUTE((always_inline)) //
+    STDEXEC_ATTRIBUTE((always_inline))
     __field<_Tag, __decay_t<_Ty>> operator()(_Ty&& __ty) const
         noexcept(__nothrow_decay_copyable<_Ty>)
     {
-        return {(_Ty&&)__ty};
+        return {static_cast<_Ty&&>(__ty)};
     }
 };
 
@@ -384,14 +398,15 @@
 template <class _Tag, class... _Args>
 concept tag_invocable = //
     requires(_Tag __tag, _Args&&... __args) {
-        tag_invoke((_Tag&&)__tag, (_Args&&)__args...);
+        tag_invoke(static_cast<_Tag&&>(__tag), static_cast<_Args&&>(__args)...);
     };
 
 template <class _Ret, class _Tag, class... _Args>
 concept __tag_invocable_r = //
     requires(_Tag __tag, _Args&&... __args) {
         {
-            static_cast<_Ret>(tag_invoke((_Tag&&)__tag, (_Args&&)__args...))
+            static_cast<_Ret>(tag_invoke(static_cast<_Tag&&>(__tag),
+                                         static_cast<_Args&&>(__args)...))
         };
     };
 
@@ -401,7 +416,8 @@
     tag_invocable<_Tag, _Args...> && //
     requires(_Tag __tag, _Args&&... __args) {
         {
-            tag_invoke((_Tag&&)__tag, (_Args&&)__args...)
+            tag_invoke(static_cast<_Tag&&>(__tag),
+                       static_cast<_Args&&>(__args)...)
         } noexcept;
     };
 
@@ -429,7 +445,8 @@
         noexcept(nothrow_tag_invocable<_Tag, _Args...>)
             -> tag_invoke_result_t<_Tag, _Args...>
     {
-        return tag_invoke((_Tag&&)__tag, (_Args&&)__args...);
+        return tag_invoke(static_cast<_Tag&&>(__tag),
+                          static_cast<_Args&&>(__args)...);
     }
 };
 
@@ -440,7 +457,7 @@
 namespace __ti
 {
 inline constexpr tag_invoke_t tag_invoke{};
-}
+} // namespace __ti
 
 using namespace __ti;
 
diff --git a/include/sdbusplus/async/stdexec/sequence_senders.hpp b/include/sdbusplus/async/stdexec/sequence_senders.hpp
index c579998..ee40ae4 100644
--- a/include/sdbusplus/async/stdexec/sequence_senders.hpp
+++ b/include/sdbusplus/async/stdexec/sequence_senders.hpp
@@ -72,7 +72,7 @@
             next_sender<tag_invoke_result_t<set_next_t, _Receiver&, _Item>>,
             "The sender returned from set_next is required to complete with set_value_t() or "
             "set_stopped_t()");
-        return tag_invoke(*this, __rcvr, (_Item&&)__item);
+        return tag_invoke(*this, __rcvr, static_cast<_Item&&>(__item));
     }
 };
 } // namespace __sequence_sndr
@@ -97,11 +97,12 @@
         using __id = __stopped_means_break;
         using _Receiver = stdexec::__t<_ReceiverId>;
         using _Token = stop_token_of_t<env_of_t<_Receiver>>;
-        STDEXEC_ATTRIBUTE((no_unique_address)) _Receiver __rcvr_;
+        STDEXEC_ATTRIBUTE((no_unique_address))
+        _Receiver __rcvr_;
 
         template <same_as<get_env_t> _GetEnv, same_as<__t> _Self>
-        friend env_of_t<_Receiver> tag_invoke(_GetEnv,
-                                              const _Self& __self) noexcept
+        friend auto tag_invoke(_GetEnv, const _Self& __self) noexcept
+            -> env_of_t<_Receiver>
         {
             return stdexec::get_env(__self.__rcvr_);
         }
@@ -195,19 +196,19 @@
         {
             using _Result =
                 tag_invoke_result_t<get_item_types_t, _TfxSender, _Env>;
-            return (_Result(*)()) nullptr;
+            return static_cast<_Result (*)()>(nullptr);
         }
         else if constexpr (__with_member_alias<_TfxSender, _Env>)
         {
             using _Result = __member_alias_t<_TfxSender, _Env>;
-            return (_Result(*)()) nullptr;
+            return static_cast<_Result (*)()>(nullptr);
         }
         else if constexpr (sender_in<_TfxSender, _Env> &&
                            !enable_sequence_sender<
                                stdexec::__decay_t<_TfxSender>>)
         {
             using _Result = item_types<stdexec::__decay_t<_TfxSender>>;
-            return (_Result(*)()) nullptr;
+            return static_cast<_Result (*)()>(nullptr);
         }
         else if constexpr (__is_debug_env<_Env>)
         {
@@ -217,14 +218,14 @@
             using _Completions [[maybe_unused]] =
                 tag_invoke_result_t<get_item_types_t,
                                     __tfx_sender<_Sender, _Env>, _Env>;
-            return (__debug::__completion_signatures(*)()) nullptr;
+            return static_cast<__debug::__completion_signatures (*)()>(nullptr);
         }
         else
         {
             using _Result =
                 __mexception<_UNRECOGNIZED_SENDER_TYPE_<>,
                              _WITH_SENDER_<_Sender>, _WITH_ENVIRONMENT_<_Env>>;
-            return (_Result(*)()) nullptr;
+            return static_cast<_Result (*)()>(nullptr);
         }
     }
 
@@ -252,7 +253,8 @@
 template <class _Sender, class _Env>
 concept has_sequence_item_types =
     requires(_Sender&& __sndr, _Env&& __env) {
-        get_item_types((_Sender&&)__sndr, (_Env&&)__env);
+        get_item_types(static_cast<_Sender&&>(__sndr),
+                       static_cast<_Env&&>(__env));
     };
 
 template <class _Sender, class _Env>
@@ -276,12 +278,12 @@
 
 template <class _Receiver, class _Item>
     requires stdexec::__callable<set_next_t, _Receiver&, _Item>
-stdexec::__msuccess __try_item(_Item*);
+auto __try_item(_Item*) -> stdexec::__msuccess;
 
 template <class _Receiver, class... _Items>
 auto __try_items(exec::item_types<_Items...>*)
     -> decltype((stdexec::__msuccess(), ...,
-                 exec::__try_item<_Receiver>((_Items*)nullptr)));
+                 exec::__try_item<_Receiver>(static_cast<_Items*>(nullptr))));
 
 template <class _Receiver, class _Items>
 concept __sequence_receiver_of =
@@ -448,11 +450,13 @@
                 "stdexec::connect(sender, receiver) must return a type that "
                 "satisfies the operation_state concept");
             next_sender_of_t<_Receiver, _TfxSender> __next = set_next(
-                __rcvr, transform_sender(__domain, (_Sender&&)__sndr, __env));
+                __rcvr, transform_sender(
+                            __domain, static_cast<_Sender&&>(__sndr), __env));
             return tag_invoke(
                 connect_t{},
                 static_cast<next_sender_of_t<_Receiver, _TfxSender>&&>(__next),
-                __stopped_means_break_t<_Receiver>{(_Receiver&&)__rcvr});
+                __stopped_means_break_t<_Receiver>{
+                    static_cast<_Receiver&&>(__rcvr)});
         }
         else if constexpr (__subscribeable_with_tag_invoke<_TfxSender,
                                                            _Receiver>)
@@ -462,10 +466,11 @@
                     tag_invoke_result_t<subscribe_t, _TfxSender, _Receiver>>,
                 "exec::subscribe(sender, receiver) must return a type that "
                 "satisfies the operation_state concept");
-            return tag_invoke(
-                subscribe_t{},
-                transform_sender(__domain, (_Sender&&)__sndr, __env),
-                (_Receiver&&)__rcvr);
+            return tag_invoke(subscribe_t{},
+                              transform_sender(__domain,
+                                               static_cast<_Sender&&>(__sndr),
+                                               __env),
+                              static_cast<_Receiver&&>(__rcvr));
         }
         else if constexpr (enable_sequence_sender<
                                stdexec::__decay_t<_TfxSender>>)
@@ -474,21 +479,25 @@
             // useful debugging information.
             using __tag_invoke::tag_invoke;
             tag_invoke(*this,
-                       transform_sender(__domain, (_Sender&&)__sndr, __env),
-                       (_Receiver&&)__rcvr);
+                       transform_sender(__domain,
+                                        static_cast<_Sender&&>(__sndr), __env),
+                       static_cast<_Receiver&&>(__rcvr));
         }
         else
         {
             next_sender_of_t<_Receiver, _TfxSender> __next = set_next(
-                __rcvr, transform_sender(__domain, (_Sender&&)__sndr, __env));
+                __rcvr, transform_sender(
+                            __domain, static_cast<_Sender&&>(__sndr), __env));
             return tag_invoke(
                 connect_t{},
                 static_cast<next_sender_of_t<_Receiver, _TfxSender>&&>(__next),
-                __stopped_means_break_t<_Receiver>{(_Receiver&&)__rcvr});
+                __stopped_means_break_t<_Receiver>{
+                    static_cast<_Receiver&&>(__rcvr)});
         }
     }
 
-    friend constexpr bool tag_invoke(forwarding_query_t, subscribe_t) noexcept
+    friend constexpr auto tag_invoke(forwarding_query_t, subscribe_t) noexcept
+        -> bool
     {
         return false;
     }
@@ -506,13 +515,13 @@
 using __sequence_sndr::subscribe_result_t;
 
 template <class _Sender, class _Receiver>
-concept sequence_sender_to =
-    sequence_receiver_from<_Receiver, _Sender> && //
-    requires(_Sender&& __sndr, _Receiver&& __rcvr) {
-        {
-            subscribe((_Sender&&)__sndr, (_Receiver&&)__rcvr)
-        };
-    };
+concept sequence_sender_to = sequence_receiver_from<_Receiver, _Sender> && //
+                             requires(_Sender&& __sndr, _Receiver&& __rcvr) {
+                                 {
+                                     subscribe(static_cast<_Sender&&>(__sndr),
+                                               static_cast<_Receiver&&>(__rcvr))
+                                 };
+                             };
 
 template <class _Receiver>
 concept __stoppable_receiver =                              //
diff --git a/include/sdbusplus/async/stdexec/stop_token.hpp b/include/sdbusplus/async/stdexec/stop_token.hpp
index 9efd84e..6c00940 100644
--- a/include/sdbusplus/async/stdexec/stop_token.hpp
+++ b/include/sdbusplus/async/stdexec/stop_token.hpp
@@ -114,17 +114,17 @@
     template <class>
     using callback_type = __callback_type;
 
-    static constexpr bool stop_requested() noexcept
+    static constexpr auto stop_requested() noexcept -> bool
     {
         return false;
     }
 
-    static constexpr bool stop_possible() noexcept
+    static constexpr auto stop_possible() noexcept -> bool
     {
         return false;
     }
 
-    bool operator==(const never_stop_token&) const noexcept = default;
+    auto operator==(const never_stop_token&) const noexcept -> bool = default;
 };
 
 template <class _Callback>
@@ -138,11 +138,11 @@
     ~in_place_stop_source();
     in_place_stop_source(in_place_stop_source&&) = delete;
 
-    in_place_stop_token get_token() const noexcept;
+    auto get_token() const noexcept -> in_place_stop_token;
 
-    bool request_stop() noexcept;
+    auto request_stop() noexcept -> bool;
 
-    bool stop_requested() const noexcept
+    auto stop_requested() const noexcept -> bool
     {
         return (__state_.load(std::memory_order_acquire) &
                 __stop_requested_flag_) != 0;
@@ -154,13 +154,13 @@
     template <class>
     friend class in_place_stop_callback;
 
-    uint8_t __lock_() const noexcept;
+    auto __lock_() const noexcept -> uint8_t;
     void __unlock_(uint8_t) const noexcept;
 
-    bool __try_lock_unless_stop_requested_(bool) const noexcept;
+    auto __try_lock_unless_stop_requested_(bool) const noexcept -> bool;
 
-    bool __try_add_callback_(
-        __stok::__in_place_stop_callback_base*) const noexcept;
+    auto __try_add_callback_(
+        __stok::__in_place_stop_callback_base*) const noexcept -> bool;
 
     void __remove_callback_(
         __stok::__in_place_stop_callback_base*) const noexcept;
@@ -188,21 +188,22 @@
         __source_(std::exchange(__other.__source_, {}))
     {}
 
-    in_place_stop_token&
-        operator=(const in_place_stop_token& __other) noexcept = default;
+    auto operator=(const in_place_stop_token& __other) noexcept
+        -> in_place_stop_token& = default;
 
-    in_place_stop_token& operator=(in_place_stop_token&& __other) noexcept
+    auto operator=(in_place_stop_token&& __other) noexcept
+        -> in_place_stop_token&
     {
         __source_ = std::exchange(__other.__source_, nullptr);
         return *this;
     }
 
-    bool stop_requested() const noexcept
+    [[nodiscard]] auto stop_requested() const noexcept -> bool
     {
         return __source_ != nullptr && __source_->stop_requested();
     }
 
-    bool stop_possible() const noexcept
+    [[nodiscard]] auto stop_possible() const noexcept -> bool
     {
         return __source_ != nullptr;
     }
@@ -212,7 +213,8 @@
         std::swap(__source_, __other.__source_);
     }
 
-    bool operator==(const in_place_stop_token&) const noexcept = default;
+    auto operator==(const in_place_stop_token&) const noexcept
+        -> bool = default;
 
   private:
     friend in_place_stop_source;
@@ -227,7 +229,8 @@
     const in_place_stop_source* __source_;
 };
 
-inline in_place_stop_token in_place_stop_source::get_token() const noexcept
+inline auto in_place_stop_source::get_token() const noexcept
+    -> in_place_stop_token
 {
     return in_place_stop_token{this};
 }
@@ -244,7 +247,7 @@
         noexcept(__nothrow_constructible_from<_Fun, _Fun2>) :
         __stok::__in_place_stop_callback_base(
             __token.__source_, &in_place_stop_callback::__execute_impl_),
-        __fun_((_Fun2&&)__fun)
+        __fun_(static_cast<_Fun2&&>(__fun))
     {
         __register_callback_();
     }
@@ -262,7 +265,8 @@
         std::move(static_cast<in_place_stop_callback*>(cb)->__fun_)();
     }
 
-    STDEXEC_ATTRIBUTE((no_unique_address)) _Fun __fun_;
+    STDEXEC_ATTRIBUTE((no_unique_address))
+    _Fun __fun_;
 };
 
 namespace __stok
@@ -289,7 +293,7 @@
     STDEXEC_ASSERT(__callbacks_ == nullptr);
 }
 
-inline bool in_place_stop_source::request_stop() noexcept
+inline auto in_place_stop_source::request_stop() noexcept -> bool
 {
     if (!__try_lock_unless_stop_requested_(true))
         return true;
@@ -326,7 +330,7 @@
     return false;
 }
 
-inline uint8_t in_place_stop_source::__lock_() const noexcept
+inline auto in_place_stop_source::__lock_() const noexcept -> uint8_t
 {
     __stok::__spin_wait __spin;
     auto __old_state = __state_.load(std::memory_order_relaxed);
@@ -349,8 +353,8 @@
     (void)__state_.store(__old_state, std::memory_order_release);
 }
 
-inline bool in_place_stop_source::__try_lock_unless_stop_requested_(
-    bool __set_stop_requested) const noexcept
+inline auto in_place_stop_source::__try_lock_unless_stop_requested_(
+    bool __set_stop_requested) const noexcept -> bool
 {
     __stok::__spin_wait __spin;
     auto __old_state = __state_.load(std::memory_order_relaxed);
@@ -383,8 +387,8 @@
     return true;
 }
 
-inline bool in_place_stop_source::__try_add_callback_(
-    __stok::__in_place_stop_callback_base* __callbk) const noexcept
+inline auto in_place_stop_source::__try_add_callback_(
+    __stok::__in_place_stop_callback_base* __callbk) const noexcept -> bool
 {
     if (!__try_lock_unless_stop_requested_(false))
     {
diff --git a/include/sdbusplus/async/stdexec/task.hpp b/include/sdbusplus/async/stdexec/task.hpp
index 4eeb9ab..60f9e49 100644
--- a/include/sdbusplus/async/stdexec/task.hpp
+++ b/include/sdbusplus/async/stdexec/task.hpp
@@ -112,9 +112,9 @@
         __scheduler_{exec::inline_scheduler{}};
     in_place_stop_token __stop_token_;
 
-    friend const __any_scheduler&
-        tag_invoke(get_scheduler_t,
-                   const __default_task_context_impl& __self) noexcept
+    friend auto tag_invoke(get_scheduler_t,
+                           const __default_task_context_impl& __self) noexcept
+        -> const __any_scheduler&
         requires(__with_scheduler)
     {
         return __self.__scheduler_;
@@ -132,10 +132,10 @@
 
     template <scheduler _Scheduler>
     explicit __default_task_context_impl(_Scheduler&& __scheduler) :
-        __scheduler_{(_Scheduler&&)__scheduler}
+        __scheduler_{static_cast<_Scheduler&&>(__scheduler)}
     {}
 
-    bool stop_requested() const noexcept
+    [[nodiscard]] auto stop_requested() const noexcept -> bool
     {
         return __stop_token_.stop_requested();
     }
@@ -144,7 +144,7 @@
     void set_scheduler(_Scheduler&& __sched)
         requires(__with_scheduler)
     {
-        __scheduler_ = (_Scheduler&&)__sched;
+        __scheduler_ = static_cast<_Scheduler&&>(__sched);
     }
 
     template <class _ThisPromise>
@@ -320,7 +320,7 @@
 template <class _Ty>
 struct __promise_base
 {
-    void return_value(_Ty value) noexcept
+    void return_value(_Ty value)
     {
         __data_.template emplace<1>(std::move(value));
     }
@@ -334,7 +334,7 @@
     struct __void
     {};
 
-    void return_void() noexcept
+    void return_void()
     {
         __data_.template emplace<1>(__void{});
     }
@@ -358,9 +358,9 @@
     };
 
     template <scheduler _Scheduler>
-    __wrap<_Scheduler> operator()(_Scheduler __sched) const noexcept
+    auto operator()(_Scheduler __sched) const noexcept -> __wrap<_Scheduler>
     {
-        return {(_Scheduler&&)__sched};
+        return {static_cast<_Scheduler&&>(__sched)};
     }
 };
 
@@ -389,13 +389,14 @@
   private:
     struct __final_awaitable
     {
-        static constexpr bool await_ready() noexcept
+        static constexpr auto await_ready() noexcept -> bool
         {
             return false;
         }
 
-        static __coro::coroutine_handle<>
+        static auto
             await_suspend(__coro::coroutine_handle<__promise> __h) noexcept
+            -> __coro::coroutine_handle<>
         {
             return __h.promise().continuation().handle();
         }
@@ -405,23 +406,23 @@
 
     struct __promise : __promise_base<_Ty>, with_awaitable_senders<__promise>
     {
-        basic_task get_return_object() noexcept
+        auto get_return_object() noexcept -> basic_task
         {
             return basic_task(
                 __coro::coroutine_handle<__promise>::from_promise(*this));
         }
 
-        __coro::suspend_always initial_suspend() noexcept
+        auto initial_suspend() noexcept -> __coro::suspend_always
         {
             return {};
         }
 
-        __final_awaitable final_suspend() noexcept
+        auto final_suspend() noexcept -> __final_awaitable
         {
             return {};
         }
 
-        __task::disposition disposition() const noexcept
+        [[nodiscard]] auto disposition() const noexcept -> __task::disposition
         {
             return static_cast<__task::disposition>(this->__data_.index());
         }
@@ -433,19 +434,21 @@
 
         template <sender _Awaitable>
             requires __scheduler_provider<_Context>
-        decltype(auto) await_transform(_Awaitable&& __awaitable) noexcept
+        auto await_transform(_Awaitable&& __awaitable) noexcept
+            -> decltype(auto)
         {
             // TODO: If we have a complete-where-it-starts query then we can
             // optimize this to avoid the reschedule
-            return as_awaitable(
-                transfer((_Awaitable&&)__awaitable, get_scheduler(__context_)),
-                *this);
+            return as_awaitable(transfer(static_cast<_Awaitable&&>(__awaitable),
+                                         get_scheduler(__context_)),
+                                *this);
         }
 
         template <class _Scheduler>
             requires __scheduler_provider<_Context>
-        decltype(auto) await_transform(
+        auto await_transform(
             __reschedule_coroutine_on::__wrap<_Scheduler> __box) noexcept
+            -> decltype(auto)
         {
             if (!std::exchange(__rescheduled_, true))
             {
@@ -467,17 +470,18 @@
         }
 
         template <class _Awaitable>
-        decltype(auto) await_transform(_Awaitable&& __awaitable) noexcept
+        auto await_transform(_Awaitable&& __awaitable) noexcept
+            -> decltype(auto)
         {
             return with_awaitable_senders<__promise>::await_transform(
-                (_Awaitable&&)__awaitable);
+                static_cast<_Awaitable&&>(__awaitable));
         }
 
         using __context_t =
             typename _Context::template promise_context_t<__promise>;
 
-        friend const __context_t& tag_invoke(get_env_t,
-                                             const __promise& __self) noexcept
+        friend auto tag_invoke(get_env_t, const __promise& __self) noexcept
+            -> const __context_t&
         {
             return __self.__context_;
         }
@@ -499,14 +503,15 @@
                 __coro_.destroy();
         }
 
-        static constexpr bool await_ready() noexcept
+        static constexpr auto await_ready() noexcept -> bool
         {
             return false;
         }
 
         template <class _ParentPromise2>
-        __coro::coroutine_handle<> await_suspend(
+        auto await_suspend(
             __coro::coroutine_handle<_ParentPromise2> __parent) noexcept
+            -> __coro::coroutine_handle<>
         {
             static_assert(__one_of<_ParentPromise, _ParentPromise2, void>);
             __context_.emplace(__coro_.promise().__context_,
@@ -522,7 +527,7 @@
             return __coro_;
         }
 
-        _Ty await_resume()
+        auto await_resume() -> _Ty
         {
             __context_.reset();
             scope_guard __on_exit{
@@ -540,16 +545,17 @@
         requires constructible_from<
             awaiter_context_t<__promise, _ParentPromise>, __promise&,
             _ParentPromise&>
-    friend __task_awaitable<_ParentPromise> tag_invoke(as_awaitable_t,
-                                                       basic_task&& __self,
-                                                       _ParentPromise&) noexcept
+    friend auto tag_invoke(as_awaitable_t, basic_task&& __self,
+                           _ParentPromise&) noexcept
+        -> __task_awaitable<_ParentPromise>
     {
         return __task_awaitable<_ParentPromise>{
             std::exchange(__self.__coro_, {})};
     }
 
     // Make this task generally awaitable:
-    friend __task_awaitable<> operator co_await(basic_task && __self) noexcept
+    friend auto operator co_await(basic_task&& __self) noexcept
+        -> __task_awaitable<>
         requires __mvalid<awaiter_context_t, __promise>
     {
         return __task_awaitable<>{std::exchange(__self.__coro_, {})};
