99#include < algorithm>
1010#include < array>
1111#include < cstddef>
12- #include < functional>
1312#include < iterator>
1413#include < type_traits>
1514#include < utility>
1615
17- template <auto ...> struct undef_v ;
18- template <typename ...> struct undef_t ;
19-
2016namespace stdx {
2117inline namespace v1 {
2218namespace cbn_detail {
@@ -145,6 +141,10 @@ template <typename... Fs> struct by_need {
145141 return concat (given_calls, extra_calls);
146142 }
147143};
144+
145+ struct safe_forward {
146+ template <typename T> constexpr auto operator ()(T &&t) -> T { return t; }
147+ };
148148} // namespace cbn_detail
149149
150150template <tuplelike Fs, tuplelike Args>
@@ -160,13 +160,18 @@ constexpr auto call_by_need(Fs &&fs, Args &&args) {
160160 std::make_index_sequence<tuple_size_v<remove_cvref_t <Args>>>{});
161161
162162 auto new_fs = [&]<std::size_t ... Is>(std::index_sequence<Is...>) {
163- return tuple{get<Is>(std::forward<Fs>(fs))..., std::identity{}};
163+ return tuple{get<Is>(std::forward<Fs>(fs))...,
164+ cbn_detail::safe_forward{}};
164165 }(std::make_index_sequence<tuple_size_v<Fs>>{});
165166
166167 auto ret = [&]<std::size_t ... Is>(std::index_sequence<Is...>) {
167- return tuple{cbn_detail::invoke<calls[Is].arg_base , calls[Is].arg_len >(
168- get<calls[Is].fn_idx >(std::move (new_fs)),
169- std::forward<Args>(args))...};
168+ return tuple<
169+ decltype (cbn_detail::invoke<calls[Is].arg_base , calls[Is].arg_len >(
170+ get<calls[Is].fn_idx >(std::move (new_fs)),
171+ std::forward<Args>(args)))...>{
172+ cbn_detail::invoke<calls[Is].arg_base , calls[Is].arg_len >(
173+ get<calls[Is].fn_idx >(std::move (new_fs)),
174+ std::forward<Args>(args))...};
170175 }(std::make_index_sequence<calls.size ()>{});
171176 return stdx::filter<cbn_detail::is_nonvoid_t >(std::move (ret));
172177}
0 commit comments