Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Compile Error When Wrapping Receiver by Derivation

Aperta
#1,408 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
35/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
cpp
Ambito
backend

Direzione di ricerca

Riproduci il malfunzionamento con l’esempio di sender e receiver, usando il build.log allegato come diagnostica prevista. Inizia da include/stdexec/__detail/__basic_sender.hpp, riga 362, e traccia come viene utilizzato il tipo di receiver derivato durante la connessione dell’operazione. Il lavoro è completato quando l’esempio viene compilato senza confondere il receiver derivato con il suo tipo base.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Given:

template<::stdexec::receiver Receiver>
struct receiver : Receiver {
  template<typename T>
    requires std::constructible_from<Receiver, T>
  explicit constexpr receiver(T&& t) noexcept(
    std::is_nothrow_constructible_v<Receiver, T>)
    : Receiver(std::forward<T>(t))
  {}
};

template<::stdexec::sender Sender>
struct sender {
  using sender_concept = ::stdexec::sender_t;
  template<typename T>
    requires std::constructible_from<Sender, T>
  explicit constexpr sender(T&& t) noexcept(
    std::is_nothrow_constructible_v<Sender, T>)
    : sender_(std::forward<T>(t))
  {}
  template<typename Self, typename Env>
  ::stdexec::completion_signatures_of_t<
    decltype(std::declval<Self>().sender_),
    Env> get_completion_signatures(this Self&&, const Env&);
  template<typename Self, typename Receiver>
    requires ::stdexec::sender_to<
      Sender,
      receiver<std::remove_cvref_t<Receiver>>>
  auto connect(this Self&& self, Receiver&& r) noexcept(
    noexcept(
      ::stdexec::connect(
        std::declval<Self>().sender_,
        receiver<std::remove_cvref_t<Receiver>>(std::declval<Receiver>()))))
  {
    return ::stdexec::connect(
      std::forward<Self>(self).sender_,
      receiver<std::remove_cvref_t<Receiver>>(std::forward<Receiver>(r)));
  }
private:
  Sender sender_;
};

template<typename T>
explicit sender(T) -> sender<T>;

The following fails to compile (at least on GCC 14.1.0):

auto op = ::stdexec::connect(
  ::stdexec::just() | ::stdexec::let_value([]() {
    return sender(
      ::stdexec::just() | ::stdexec::then([]() noexcept {
        return 5;
      }));
  }),
  make_receiver([](auto&&...) noexcept {}));

Where the make_receiver invocation simply creates a receiver that accepts anything.

Internally the machinery seems to be confusing the derived type with the base type:

/scratch/mdx/src/../include/stdexec/__detail/__basic_sender.hpp:362:84: error: cannot convert ‘stdexec::__detail::__op_state<stdexec::__sexpr<<lambda closure object>stdexec::{anonymous}::<lambda()>(), stdexec::{anonymous}::__anon>, mdx::execution::tests::{anonymous}::receiver<stdexec::__any_::__receiver_ref<stdexec::completion_signatures<stdexec::__rcvrs::set_value_t(int)> > > >* const’ to ‘stdexec::__detail::__receiver<stdexec::__any_::__receiver_ref<stdexec::completion_signatures<stdexec::__rcvrs::set_value_t(int)> >, stdexec::__sexpr<<lambda closure object>stdexec::{anonymous}::<lambda()>(), stdexec::{anonymous}::__anon>, stdexec::__muchar (*)[1]>::__t::__parent_op_t*’ {aka ‘stdexec::__detail::__op_state<stdexec::__sexpr<<lambda closure object>stdexec::{anonymous}::<lambda()>(), stdexec::{anonymous}::__anon>, stdexec::__any_::__receiver_ref<stdexec::completion_signatures<stdexec::__rcvrs::set_value_t(int)> > >*’} in initialization
  362 |           return __tuple{connect(static_cast<_Child&&>(__child), __receiver_t<_Is>{__op_})...};
      |                                                                                    ^~~~~
      |                                                                                    |
      |                                                                                    stdexec::__detail::__op_state<stdexec::__sexpr<<lambda closure object>stdexec::{anonymous}::<lambda()>(), stdexec::{anonymous}::__anon>, mdx::execution::tests::{anonymous}::receiver<stdexec::__any_::__receiver_ref<stdexec::completion_signatures<stdexec::__rcvrs::set_value_t(int)> > > >* const

Full compilation output attached.

build.log

Lingua principale
C++
Stelle
2.4k
Fork
270
Merge medio
1g 10h
PR unite (30g)
35

Preparare l'ambiente

Non abbiamo ancora controllato i file di configurazione di questo progetto. Parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di NVIDIA/stdexec

Tutte le issue di NVIDIA/stdexec

Issue simili

Altre issue su C++

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.