compressed_pair: correctly manage references with piecewise construction

This commit is contained in:
Michele Caini
2022-02-24 09:10:15 +01:00
parent 4c692c23bb
commit dc238db355
2 changed files with 10 additions and 4 deletions

View File

@@ -32,7 +32,7 @@ struct compressed_pair_element {
template<typename... Args, std::size_t... Index>
compressed_pair_element(std::tuple<Args...> args, std::index_sequence<Index...>)
: value{std::get<Index>(args)...} {}
: value{std::forward<Args>(std::get<Index>(args))...} {}
[[nodiscard]] reference get() ENTT_NOEXCEPT {
return value;
@@ -62,7 +62,7 @@ struct compressed_pair_element<Type, Tag, std::enable_if_t<is_ebco_eligible_v<Ty
template<typename... Args, std::size_t... Index>
compressed_pair_element(std::tuple<Args...> args, std::index_sequence<Index...>)
: base_type{std::get<Index>(args)...} {}
: base_type{std::forward<Args>(std::get<Index>(args))...} {}
[[nodiscard]] reference get() ENTT_NOEXCEPT {
return *this;

View File

@@ -1,6 +1,8 @@
#include <cstddef>
#include <tuple>
#include <type_traits>
#include <utility>
#include <vector>
#include <gtest/gtest.h>
#include <entt/config/config.h>
#include <entt/core/compressed_pair.hpp>
@@ -89,9 +91,13 @@ TEST(CompressedPair, ConstructCopyMove) {
}
TEST(CompressedPair, PiecewiseConstruct) {
entt::compressed_pair<empty_type, int> pair{std::piecewise_construct, std::make_tuple(), std::make_tuple(3)};
std::vector<int> vec{42};
entt::compressed_pair<empty_type, empty_type> empty{std::piecewise_construct, std::make_tuple(), std::make_tuple()};
entt::compressed_pair<std::vector<int>, std::size_t> pair{std::piecewise_construct, std::forward_as_tuple(std::move(vec)), std::make_tuple(sizeof(empty))};
ASSERT_EQ(pair.second(), 3);
ASSERT_EQ(pair.first().size(), 1u);
ASSERT_EQ(pair.second(), sizeof(empty));
ASSERT_EQ(vec.size(), 0u);
}
TEST(CompressedPair, DeductionGuide) {