Преглед на файлове

meta: meta_handle accepts only lvalue references as it ought to be

Michele Caini преди 5 години
родител
ревизия
8d0611a188
променени са 2 файла, в които са добавени 4 реда и са изтрити 5 реда
  1. 1 1
      src/entt/meta/factory.hpp
  2. 3 4
      src/entt/meta/meta.hpp

+ 1 - 1
src/entt/meta/factory.hpp

@@ -681,7 +681,7 @@ public:
             &internal::meta_info<std::conditional_t<std::is_same_v<Policy, as_void_t>, void, typename helper_type::return_type>>::resolve,
             &helper_type::arg,
             [](meta_handle instance, meta_any *args) {
-                return internal::invoke<Type, Candidate, Policy>(*instance, args, std::make_index_sequence<std::tuple_size_v<typename helper_type::args_type>>{});
+                return internal::invoke<Type, Candidate, Policy>(std::move(instance), args, std::make_index_sequence<std::tuple_size_v<typename helper_type::args_type>>{});
             }
         };
 

+ 3 - 4
src/entt/meta/meta.hpp

@@ -541,13 +541,12 @@ struct meta_handle {
      * @param value An instance of an object to use to initialize the handle.
      */
     template<typename Type, typename = std::enable_if_t<!std::is_same_v<std::remove_cv_t<std::remove_reference_t<Type>>, meta_handle>>>
-    meta_handle(Type &&value) ENTT_NOEXCEPT
+    meta_handle(Type &value) ENTT_NOEXCEPT
         : meta_handle{}
     {
         if constexpr(std::is_same_v<std::remove_cv_t<std::remove_reference_t<Type>>, meta_any>) {
             any = value.ref();
         } else {
-            static_assert(std::is_lvalue_reference_v<Type>, "Lvalue reference required");
             any = std::ref(value);
         }
     }
@@ -955,7 +954,7 @@ struct meta_func {
      * @return A meta any containing the returned value, if any.
      */
     meta_any invoke(meta_handle instance, meta_any * const args, const std::size_t sz) const {
-        return sz == size() ? node->invoke(instance, args) : meta_any{};
+        return sz == size() ? node->invoke(std::move(instance), args) : meta_any{};
     }
 
     /**
@@ -971,7 +970,7 @@ struct meta_func {
     template<typename... Args>
     meta_any invoke(meta_handle instance, Args &&... args) const {
         std::array<meta_any, sizeof...(Args)> arguments{std::forward<Args>(args)...};
-        return invoke(instance, arguments.data(), sizeof...(Args));
+        return invoke(std::move(instance), arguments.data(), sizeof...(Args));
     }
 
     /*! @copydoc meta_ctor::prop */