Răsfoiți Sursa

compressed_pair: correctly manage references with piecewise construction

Michele Caini 4 ani în urmă
părinte
comite
dc238db355
2 a modificat fișierele cu 10 adăugiri și 4 ștergeri
  1. 2 2
      src/entt/core/compressed_pair.hpp
  2. 8 2
      test/entt/core/compressed_pair.cpp

+ 2 - 2
src/entt/core/compressed_pair.hpp

@@ -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;

+ 8 - 2
test/entt/core/compressed_pair.cpp

@@ -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) {