https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95540
--- Comment #6 from Iain Sandoe <iains at gcc dot gnu.org> --- (In reply to Michael Bruck from comment #5) > > Since the coroutine traits are global, and the closure type is unique, > > that provides a way to disambiguate instantiations of the traits for > > lambdas with otherwise identical signatures. > > But the closure type is generated in the same lambda expression where the > coroutine generator looks up the coroutine_traits<>. How do I specialize on > that? I wasn't meaning to suggest you can specialise per lambda (but I was saying that the traits instantiated will be unique per lambda) - perhaps the latter is an implementation detail. Providing the class/callable object type to the traits look does allow specialisations like ... template<typename R, typename CallOp, typename ...T> struct std::coroutine_traits<R, CallOp, T...> { struct promise_type { promise_type (CallOp op, T ...args) {} Fake get_return_object() { return {}; } std::suspend_always initial_suspend() { return {}; } .... to be possible. ( I might be getting out of my depth with the long history of the design evolution here - but this is my understanding of the rationale for the status quo ).