Michele Caini 4 лет назад
Родитель
Сommit
a96a767b9b
2 измененных файлов с 15 добавлено и 5 удалено
  1. 2 2
      src/entt/meta/utility.hpp
  2. 13 3
      test/entt/meta/meta_ctor.cpp

+ 2 - 2
src/entt/meta/utility.hpp

@@ -298,7 +298,7 @@ template<typename Type, typename... Args, std::size_t... Index>
         return Type{(args+Index)->cast<Args>()...};
         return Type{(args+Index)->cast<Args>()...};
     }
     }
 
 
-    return {};
+    return meta_any{};
 }
 }
 
 
 
 
@@ -390,7 +390,7 @@ template<typename Type, typename Policy = as_is_t, typename Candidate>
  */
  */
 template<typename Type, auto Candidate, typename Policy = as_is_t>
 template<typename Type, auto Candidate, typename Policy = as_is_t>
 [[nodiscard]] meta_any meta_construct(meta_any * const args) {
 [[nodiscard]] meta_any meta_construct(meta_any * const args) {
-    return meta_construct<Type, Policy>(Candidate, args);
+    return meta_invoke<Type, Policy>({}, Candidate, args);
 }
 }
 
 
 
 

+ 13 - 3
test/entt/meta/meta_ctor.cpp

@@ -16,7 +16,7 @@ struct derived_t: base_t {
 };
 };
 
 
 struct clazz_t {
 struct clazz_t {
-    clazz_t(const base_t &other, int iv)
+    clazz_t(const base_t &other, int &iv)
         : clazz_t{iv, other.value}
         : clazz_t{iv, other.value}
     {}
     {}
 
 
@@ -55,7 +55,7 @@ struct MetaCtor: ::testing::Test {
         entt::meta<clazz_t>()
         entt::meta<clazz_t>()
             .type("clazz"_hs)
             .type("clazz"_hs)
             .ctor<&entt::registry::emplace_or_replace<clazz_t, const int &, const char &>, entt::as_ref_t>()
             .ctor<&entt::registry::emplace_or_replace<clazz_t, const int &, const char &>, entt::as_ref_t>()
-            .ctor<const base_t &, int>()
+            .ctor<const base_t &, int &>()
             .ctor<const int &, char>()
             .ctor<const int &, char>()
             .ctor<entt::overload<clazz_t(int)>(clazz_t::factory)>()
             .ctor<entt::overload<clazz_t(int)>(clazz_t::factory)>()
             .ctor<entt::overload<clazz_t(base_t, int, int)>(clazz_t::factory)>()
             .ctor<entt::overload<clazz_t(base_t, int, int)>(clazz_t::factory)>()
@@ -114,7 +114,6 @@ TEST_F(MetaCtor, ArithmeticConversion) {
 TEST_F(MetaCtor, ConstNonConstRefArgs) {
 TEST_F(MetaCtor, ConstNonConstRefArgs) {
     int ivalue = 42;
     int ivalue = 42;
     const char cvalue = 'c';
     const char cvalue = 'c';
-
     auto any = entt::resolve<clazz_t>().construct(entt::forward_as_meta(ivalue), entt::forward_as_meta(cvalue));
     auto any = entt::resolve<clazz_t>().construct(entt::forward_as_meta(ivalue), entt::forward_as_meta(cvalue));
 
 
     ASSERT_TRUE(any);
     ASSERT_TRUE(any);
@@ -122,6 +121,17 @@ TEST_F(MetaCtor, ConstNonConstRefArgs) {
     ASSERT_EQ(any.cast<clazz_t>().c, 'c');
     ASSERT_EQ(any.cast<clazz_t>().c, 'c');
 }
 }
 
 
+TEST_F(MetaCtor, WrongConstness) {
+    int value = 42;
+    auto any = entt::resolve<clazz_t>().construct(derived_t{}, entt::forward_as_meta(value));
+    auto other = entt::resolve<clazz_t>().construct(derived_t{}, entt::forward_as_meta(std::as_const(value)));
+
+    ASSERT_TRUE(any);
+    ASSERT_FALSE(other);
+    ASSERT_EQ(any.cast<clazz_t>().i, 42);
+    ASSERT_EQ(any.cast<clazz_t>().c, 'c');
+}
+
 TEST_F(MetaCtor, FuncMetaAnyArgs) {
 TEST_F(MetaCtor, FuncMetaAnyArgs) {
     auto any = entt::resolve<clazz_t>().construct(entt::meta_any{42});
     auto any = entt::resolve<clazz_t>().construct(entt::meta_any{42});