Fix a bug in the pack traversal where the container content wasn't perfectly forwarded

This commit is contained in:
Denis Blank 2018-03-09 08:12:15 +01:00
parent deb798118c
commit c4cb102795
2 changed files with 17 additions and 1 deletions

View File

@ -517,7 +517,7 @@ void remap(
strategy_traverse_tag, T&& container, M&& mapper,
typename std::enable_if<is_effective_t<M, element_of_t<T>>::value>::type* =
nullptr) {
for (auto&& element : std::forward<T>(container)) {
for (auto&& element : container_accessor_of(std::forward<T>(container))) {
std::forward<M>(mapper)(std::forward<decltype(element)>(element));
}
}

View File

@ -542,6 +542,22 @@ TEST(test_strategic_container_traverse, type_changed_move_only) {
EXPECT_EQ(res[0], 5);
}
TEST(test_strategic_container_traverse, traverse_move_only_wrapped) {
std::vector<std::unique_ptr<int>> container;
container.push_back(std::unique_ptr<int>(new int(5)));
std::size_t counter = 0;
traverse_pack(
[&counter](auto&& ptr) {
std::unique_ptr<int> moved(std::forward<decltype(ptr)>(ptr));
EXPECT_EQ((*moved), 5);
++counter;
},
std::make_tuple(std::move(container)));
EXPECT_EQ(counter, 1U);
}
// Every element in the container is remapped
// - Plain container
TEST(test_strategic_container_traverse, every_element_remapped_plain) {