Skip to content

Commit 8993e7a

Browse files
committed
🐛 Tuple transform should preserve references
When using `stdx::transform` on a tuple containing references, those references would previously be decayed. Now they are preserved.
1 parent 9681803 commit 8993e7a

2 files changed

Lines changed: 15 additions & 2 deletions

File tree

include/stdx/tuple_algorithms.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,11 @@ template <template <typename> typename... Fs, typename Op, typename T,
9292
constexpr auto transform(Op &&op, T &&t, Ts &&...ts) {
9393
return [&]<std::size_t... Is>(std::index_sequence<Is...>) {
9494
if constexpr (sizeof...(Fs) == 0) {
95-
return stdx::make_tuple(
95+
return stdx::tuple<decltype(detail::invoke_at<Is>(
96+
std::forward<Op>(op), std::forward<T>(t),
97+
std::forward<Ts>(ts)...))...>{
9698
detail::invoke_at<Is>(std::forward<Op>(op), std::forward<T>(t),
97-
std::forward<Ts>(ts)...)...);
99+
std::forward<Ts>(ts)...)...};
98100
} else {
99101
return stdx::make_indexed_tuple<Fs...>(
100102
detail::invoke_at<Is>(std::forward<Op>(op), std::forward<T>(t),

test/tuple_algorithms.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,17 @@ TEST_CASE("rvalue transform", "[tuple_algorithms]") {
4242
CHECK(u == stdx::tuple{2, 3, 4});
4343
}
4444

45+
TEST_CASE("transform preserves references", "[tuple_algorithms]") {
46+
int value{1};
47+
auto const u = stdx::transform(
48+
[&](auto i) -> int & {
49+
value += i;
50+
return value;
51+
},
52+
stdx::tuple{1});
53+
CHECK(std::addressof(value) == std::addressof(u[stdx::index<0>]));
54+
}
55+
4556
namespace {
4657
template <typename Key, typename Value> struct map_entry {
4758
using key_t = Key;

0 commit comments

Comments
 (0)