Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

Compile Error When Wrapping Receiver by Derivation

Đang mở
#1,408 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
35/100
Loại issue
Lỗi
Độ rõ ràng
Khá rõ ràng
Mức độ hoạt động
Đình trệ
Công nghệ
cpp
Lĩnh vực
backend

Hướng nghiên cứu

Tái hiện lỗi với ví dụ sender và receiver, sử dụng build.log đính kèm làm chẩn đoán dự kiến. Bắt đầu tại include/stdexec/__detail/__basic_sender.hpp dòng 362 và theo dõi cách kiểu receiver dẫn xuất được sử dụng khi kết nối operation. Hoàn tất khi ví dụ biên dịch mà không nhầm receiver dẫn xuất với kiểu cơ sở của nó.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

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

Ngôn ngữ chính
C++
Star
2.4k
Fork
274
Merge trung bình
1 ngày 13 giờ
Pull request đã merge (30 ngày)
38

Chuẩn bị môi trường

Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của NVIDIA/stdexec

Tất cả issue của NVIDIA/stdexec

Issue tương tự

Thêm issue về C++

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.