https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105153

            Bug ID: 105153
           Summary: wrong constraint in std::expected<void>'s constructor
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hewillk at gmail dot com
  Target Milestone: ---

std/expected#L970:

    template<typename _Up, typename _Gr>
      requires is_void_v<_Tp>
          && is_constructible_v<_Er, const _Gr&>
          && (!__cons_from_expected<_Up, _Gr>)
    constexpr explicit(!is_convertible_v<_Gr, _Er>)
    expected(expected<_Up, _Gr>&& __x)
    noexcept(is_nothrow_constructible_v<_Er, _Gr>)
    : _M_void(), _M_has_value(__x._M_has_value)
    {
      if (!_M_has_value)
        std::construct_at(__builtin_addressof(_M_unex),
                          std::move(__x)._M_unex);
    }

Should be is_constructible_v<_Er, _Gr>.

#include <expected>

struct E {
  E(int&&) = delete;
  E(const int&);
};

int main() {
  std::expected<void, E> e(std::expected<void, int>{});
}

https://godbolt.org/z/KGa4b7aYa

Reply via email to