فهرست منبع

entt: std::remove_const_t<std::remove_reference_t<...>> -> std::remove_cvref_t<...>

skypjack 2 ماه پیش
والد
کامیت
2f2fe11343

+ 4 - 4
src/entt/core/any.hpp

@@ -68,7 +68,7 @@ class basic_any: private internal::basic_any_storage<Len, Align> {
 
 
     template<typename Type>
     template<typename Type>
     static const void *basic_vtable(const request req, const basic_any &value, const void *other) {
     static const void *basic_vtable(const request req, const basic_any &value, const void *other) {
-        static_assert(std::is_same_v<std::remove_const_t<std::remove_reference_t<Type>>, Type>, "Invalid type");
+        static_assert(std::is_same_v<std::remove_cvref_t<Type>, Type>, "Invalid type");
 
 
         switch(const auto *elem = static_cast<const Type *>(value.data()); req) {
         switch(const auto *elem = static_cast<const Type *>(value.data()); req) {
             using enum internal::any_request;
             using enum internal::any_request;
@@ -112,7 +112,7 @@ class basic_any: private internal::basic_any_storage<Len, Align> {
 
 
     template<typename Type>
     template<typename Type>
     static void basic_deleter(const basic_any &value) {
     static void basic_deleter(const basic_any &value) {
-        static_assert(std::is_same_v<std::remove_const_t<std::remove_reference_t<Type>>, Type>, "Invalid type");
+        static_assert(std::is_same_v<std::remove_cvref_t<Type>, Type>, "Invalid type");
         ENTT_ASSERT((value.mode == any_policy::dynamic) || ((value.mode == any_policy::embedded) && !std::is_trivially_destructible_v<Type>), "Unexpected policy");
         ENTT_ASSERT((value.mode == any_policy::dynamic) || ((value.mode == any_policy::embedded) && !std::is_trivially_destructible_v<Type>), "Unexpected policy");
 
 
         const auto *elem = static_cast<const Type *>(value.data());
         const auto *elem = static_cast<const Type *>(value.data());
@@ -128,7 +128,7 @@ class basic_any: private internal::basic_any_storage<Len, Align> {
 
 
     template<typename Type, typename... Args>
     template<typename Type, typename... Args>
     void initialize([[maybe_unused]] Args &&...args) {
     void initialize([[maybe_unused]] Args &&...args) {
-        using plain_type = std::remove_const_t<std::remove_reference_t<Type>>;
+        using plain_type = std::remove_cvref_t<Type>;
 
 
         vtable = basic_vtable<plain_type>;
         vtable = basic_vtable<plain_type>;
         underlying_type = type_hash<plain_type>::value();
         underlying_type = type_hash<plain_type>::value();
@@ -559,7 +559,7 @@ template<typename Type, std::size_t Len, std::size_t Align>
 template<typename Type, std::size_t Len, std::size_t Align>
 template<typename Type, std::size_t Len, std::size_t Align>
 // NOLINTNEXTLINE(cppcoreguidelines-rvalue-reference-param-not-moved)
 // NOLINTNEXTLINE(cppcoreguidelines-rvalue-reference-param-not-moved)
 [[nodiscard]] std::remove_const_t<Type> any_cast(basic_any<Len, Align> &&data) noexcept {
 [[nodiscard]] std::remove_const_t<Type> any_cast(basic_any<Len, Align> &&data) noexcept {
-    if constexpr(std::is_copy_constructible_v<std::remove_const_t<std::remove_reference_t<Type>>>) {
+    if constexpr(std::is_copy_constructible_v<std::remove_cvref_t<Type>>) {
         if(auto *const instance = any_cast<std::remove_reference_t<Type>>(&data); instance) {
         if(auto *const instance = any_cast<std::remove_reference_t<Type>>(&data); instance) {
             return static_cast<Type>(std::move(*instance));
             return static_cast<Type>(std::move(*instance));
         }
         }

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

@@ -22,7 +22,7 @@ struct compressed_pair_element {
     // NOLINTNEXTLINE(modernize-use-equals-default)
     // NOLINTNEXTLINE(modernize-use-equals-default)
     constexpr compressed_pair_element() noexcept(std::is_nothrow_default_constructible_v<Type>) {}
     constexpr compressed_pair_element() noexcept(std::is_nothrow_default_constructible_v<Type>) {}
 
 
-    template<typename Arg, typename = std::enable_if_t<!std::is_same_v<std::remove_const_t<std::remove_reference_t<Arg>>, compressed_pair_element>>>
+    template<typename Arg, typename = std::enable_if_t<!std::is_same_v<std::remove_cvref_t<Arg>, compressed_pair_element>>>
     constexpr compressed_pair_element(Arg &&arg) noexcept(std::is_nothrow_constructible_v<Type, Arg>)
     constexpr compressed_pair_element(Arg &&arg) noexcept(std::is_nothrow_constructible_v<Type, Arg>)
         : value{std::forward<Arg>(arg)} {}
         : value{std::forward<Arg>(arg)} {}
 
 
@@ -52,7 +52,7 @@ struct compressed_pair_element<Type, Tag, std::enable_if_t<is_ebco_eligible_v<Ty
     constexpr compressed_pair_element() noexcept(std::is_nothrow_default_constructible_v<base_type>)
     constexpr compressed_pair_element() noexcept(std::is_nothrow_default_constructible_v<base_type>)
         : base_type{} {}
         : base_type{} {}
 
 
-    template<typename Arg, typename = std::enable_if_t<!std::is_same_v<std::remove_const_t<std::remove_reference_t<Arg>>, compressed_pair_element>>>
+    template<typename Arg, typename = std::enable_if_t<!std::is_same_v<std::remove_cvref_t<Arg>, compressed_pair_element>>>
     constexpr compressed_pair_element(Arg &&arg) noexcept(std::is_nothrow_constructible_v<base_type, Arg>)
     constexpr compressed_pair_element(Arg &&arg) noexcept(std::is_nothrow_constructible_v<base_type, Arg>)
         : base_type{std::forward<Arg>(arg)} {}
         : base_type{std::forward<Arg>(arg)} {}
 
 

+ 6 - 6
src/entt/core/type_info.hpp

@@ -146,9 +146,9 @@ struct type_info final {
     template<typename Type>
     template<typename Type>
     // NOLINTBEGIN(modernize-use-transparent-functors)
     // NOLINTBEGIN(modernize-use-transparent-functors)
     constexpr type_info(std::in_place_type_t<Type>) noexcept
     constexpr type_info(std::in_place_type_t<Type>) noexcept
-        : seq{type_index<std::remove_const_t<std::remove_reference_t<Type>>>::value()},
-          identifier{type_hash<std::remove_const_t<std::remove_reference_t<Type>>>::value()},
-          alias{type_name<std::remove_const_t<std::remove_reference_t<Type>>>::value()} {}
+        : seq{type_index<std::remove_cvref_t<Type>>::value()},
+          identifier{type_hash<std::remove_cvref_t<Type>>::value()},
+          alias{type_name<std::remove_cvref_t<Type>>::value()} {}
     // NOLINTEND(modernize-use-transparent-functors)
     // NOLINTEND(modernize-use-transparent-functors)
 
 
     /**
     /**
@@ -257,11 +257,11 @@ private:
  */
  */
 template<typename Type>
 template<typename Type>
 [[nodiscard]] const type_info &type_id() noexcept {
 [[nodiscard]] const type_info &type_id() noexcept {
-    if constexpr(std::is_same_v<Type, std::remove_const_t<std::remove_reference_t<Type>>>) {
+    if constexpr(std::is_same_v<Type, std::remove_cvref_t<Type>>) {
         static const type_info instance{std::in_place_type<Type>};
         static const type_info instance{std::in_place_type<Type>};
         return instance;
         return instance;
     } else {
     } else {
-        return type_id<std::remove_const_t<std::remove_reference_t<Type>>>();
+        return type_id<std::remove_cvref_t<Type>>();
     }
     }
 }
 }
 
 
@@ -269,7 +269,7 @@ template<typename Type>
 template<typename Type>
 template<typename Type>
 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
 [[nodiscard]] const type_info &type_id(Type &&) noexcept {
 [[nodiscard]] const type_info &type_id(Type &&) noexcept {
-    return type_id<std::remove_const_t<std::remove_reference_t<Type>>>();
+    return type_id<std::remove_cvref_t<Type>>();
 }
 }
 
 
 } // namespace entt
 } // namespace entt

+ 1 - 1
src/entt/entity/registry.hpp

@@ -180,7 +180,7 @@ public:
 
 
     template<typename Type>
     template<typename Type>
     Type &insert_or_assign(const id_type id, Type &&value) {
     Type &insert_or_assign(const id_type id, Type &&value) {
-        return any_cast<std::remove_const_t<std::remove_reference_t<Type>> &>(ctx.insert_or_assign(id, std::forward<Type>(value)).first->second);
+        return any_cast<std::remove_cvref_t<Type> &>(ctx.insert_or_assign(id, std::forward<Type>(value)).first->second);
     }
     }
 
 
     template<typename Type>
     template<typename Type>

+ 3 - 3
src/entt/entity/view.hpp

@@ -24,7 +24,7 @@ static constexpr bool tombstone_check_v = ((sizeof...(Type) == 1u) && ... && (Ty
 
 
 template<typename Type>
 template<typename Type>
 const Type *view_placeholder() {
 const Type *view_placeholder() {
-    static_assert(std::is_same_v<std::remove_const_t<std::remove_reference_t<Type>>, Type>, "Unexpected type");
+    static_assert(std::is_same_v<std::remove_cvref_t<Type>, Type>, "Unexpected type");
     static const Type placeholder{};
     static const Type placeholder{};
     return &placeholder;
     return &placeholder;
 }
 }
@@ -227,7 +227,7 @@ class basic_view;
  */
  */
 template<typename Type, bool Checked, std::size_t Get, std::size_t Exclude>
 template<typename Type, bool Checked, std::size_t Get, std::size_t Exclude>
 class basic_common_view {
 class basic_common_view {
-    static_assert(std::is_same_v<std::remove_const_t<std::remove_reference_t<Type>>, Type>, "Unexpected type");
+    static_assert(std::is_same_v<std::remove_cvref_t<Type>, Type>, "Unexpected type");
 
 
     template<typename Return, typename View, typename Other, std::size_t... GLhs, std::size_t... ELhs, std::size_t... GRhs, std::size_t... ERhs>
     template<typename Return, typename View, typename Other, std::size_t... GLhs, std::size_t... ELhs, std::size_t... GRhs, std::size_t... ERhs>
     friend Return internal::view_pack(const View &, const Other &, std::index_sequence<GLhs...>, std::index_sequence<ELhs...>, std::index_sequence<GRhs...>, std::index_sequence<ERhs...>);
     friend Return internal::view_pack(const View &, const Other &, std::index_sequence<GLhs...>, std::index_sequence<ELhs...>, std::index_sequence<GRhs...>, std::index_sequence<ERhs...>);
@@ -690,7 +690,7 @@ public:
  */
  */
 template<typename Type, deletion_policy Policy>
 template<typename Type, deletion_policy Policy>
 class basic_storage_view {
 class basic_storage_view {
-    static_assert(std::is_same_v<std::remove_const_t<std::remove_reference_t<Type>>, Type>, "Unexpected type");
+    static_assert(std::is_same_v<std::remove_cvref_t<Type>, Type>, "Unexpected type");
 
 
 protected:
 protected:
     /*! @cond TURN_OFF_DOXYGEN */
     /*! @cond TURN_OFF_DOXYGEN */

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

@@ -63,7 +63,7 @@ inline constexpr bool reserve_aware_container_v = reserve_aware_container<Type>:
  */
  */
 template<typename Type>
 template<typename Type>
 struct basic_meta_sequence_container_traits {
 struct basic_meta_sequence_container_traits {
-    static_assert(std::is_same_v<Type, std::remove_const_t<std::remove_reference_t<Type>>>, "Unexpected type");
+    static_assert(std::is_same_v<Type, std::remove_cvref_t<Type>>, "Unexpected type");
 
 
     /*! @brief Unsigned integer type. */
     /*! @brief Unsigned integer type. */
     using size_type = meta_sequence_container::size_type;
     using size_type = meta_sequence_container::size_type;
@@ -187,7 +187,7 @@ struct basic_meta_sequence_container_traits {
  */
  */
 template<typename Type>
 template<typename Type>
 struct basic_meta_associative_container_traits {
 struct basic_meta_associative_container_traits {
-    static_assert(std::is_same_v<Type, std::remove_const_t<std::remove_reference_t<Type>>>, "Unexpected type");
+    static_assert(std::is_same_v<Type, std::remove_cvref_t<Type>>, "Unexpected type");
 
 
     /*! @brief Unsigned integer type. */
     /*! @brief Unsigned integer type. */
     using size_type = meta_associative_container::size_type;
     using size_type = meta_associative_container::size_type;

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

@@ -223,7 +223,7 @@ public:
      */
      */
     template<auto Candidate>
     template<auto Candidate>
     auto conv() noexcept {
     auto conv() noexcept {
-        using conv_type = std::remove_const_t<std::remove_reference_t<std::invoke_result_t<decltype(Candidate), Type &>>>;
+        using conv_type = std::remove_cvref_t<std::invoke_result_t<decltype(Candidate), Type &>>;
         auto *const op = +[](const meta_ctx &area, const void *instance) { return forward_as_meta(area, std::invoke(Candidate, *static_cast<const Type *>(instance))); };
         auto *const op = +[](const meta_ctx &area, const void *instance) { return forward_as_meta(area, std::invoke(Candidate, *static_cast<const Type *>(instance))); };
         base_type::insert_or_assign(internal::meta_conv_node{type_id<conv_type>().hash(), op});
         base_type::insert_or_assign(internal::meta_conv_node{type_id<conv_type>().hash(), op});
         return *this;
         return *this;
@@ -240,7 +240,7 @@ public:
      */
      */
     template<typename To>
     template<typename To>
     meta_factory conv() noexcept {
     meta_factory conv() noexcept {
-        using conv_type = std::remove_const_t<std::remove_reference_t<To>>;
+        using conv_type = std::remove_cvref_t<To>;
         auto *const op = +[](const meta_ctx &area, const void *instance) { return forward_as_meta(area, static_cast<To>(*static_cast<const Type *>(instance))); };
         auto *const op = +[](const meta_ctx &area, const void *instance) { return forward_as_meta(area, static_cast<To>(*static_cast<const Type *>(instance))); };
         base_type::insert_or_assign(internal::meta_conv_node{type_id<conv_type>().hash(), op});
         base_type::insert_or_assign(internal::meta_conv_node{type_id<conv_type>().hash(), op});
         return *this;
         return *this;
@@ -263,7 +263,7 @@ public:
     meta_factory ctor() noexcept {
     meta_factory ctor() noexcept {
         using descriptor = meta_function_helper_t<Type, decltype(Candidate)>;
         using descriptor = meta_function_helper_t<Type, decltype(Candidate)>;
         static_assert(Policy::template value<typename descriptor::return_type>, "Invalid return type for the given policy");
         static_assert(Policy::template value<typename descriptor::return_type>, "Invalid return type for the given policy");
-        static_assert(std::is_same_v<std::remove_const_t<std::remove_reference_t<typename descriptor::return_type>>, Type>, "The function doesn't return an object of the required type");
+        static_assert(std::is_same_v<std::remove_cvref_t<typename descriptor::return_type>, Type>, "The function doesn't return an object of the required type");
         base_type::insert_or_assign(internal::meta_ctor_node{type_id<typename descriptor::args_type>().hash(), descriptor::args_type::size, &meta_arg<typename descriptor::args_type>, &meta_construct<Type, Candidate, Policy>});
         base_type::insert_or_assign(internal::meta_ctor_node{type_id<typename descriptor::args_type>().hash(), descriptor::args_type::size, &meta_arg<typename descriptor::args_type>, &meta_construct<Type, Candidate, Policy>});
         return *this;
         return *this;
     }
     }
@@ -328,8 +328,8 @@ public:
                     /* this is never static */
                     /* this is never static */
                     std::is_const_v<std::remove_reference_t<data_type>> ? internal::meta_traits::is_const : internal::meta_traits::is_none,
                     std::is_const_v<std::remove_reference_t<data_type>> ? internal::meta_traits::is_const : internal::meta_traits::is_none,
                     1u,
                     1u,
-                    &internal::resolve<std::remove_const_t<std::remove_reference_t<data_type>>>,
-                    &meta_arg<type_list<std::remove_const_t<std::remove_reference_t<data_type>>>>,
+                    &internal::resolve<std::remove_cvref_t<data_type>>,
+                    &meta_arg<type_list<std::remove_cvref_t<data_type>>>,
                     &meta_setter<Type, Data>,
                     &meta_setter<Type, Data>,
                     &meta_getter<Type, Data, Policy>});
                     &meta_getter<Type, Data, Policy>});
         } else {
         } else {
@@ -347,8 +347,8 @@ public:
                     name,
                     name,
                     ((!std::is_pointer_v<decltype(Data)> || std::is_const_v<data_type>) ? internal::meta_traits::is_const : internal::meta_traits::is_none) | internal::meta_traits::is_static,
                     ((!std::is_pointer_v<decltype(Data)> || std::is_const_v<data_type>) ? internal::meta_traits::is_const : internal::meta_traits::is_none) | internal::meta_traits::is_static,
                     1u,
                     1u,
-                    &internal::resolve<std::remove_const_t<std::remove_reference_t<data_type>>>,
-                    &meta_arg<type_list<std::remove_const_t<std::remove_reference_t<data_type>>>>,
+                    &internal::resolve<std::remove_cvref_t<data_type>>,
+                    &meta_arg<type_list<std::remove_cvref_t<data_type>>>,
                     &meta_setter<Type, Data>,
                     &meta_setter<Type, Data>,
                     &meta_getter<Type, Data, Policy>});
                     &meta_getter<Type, Data, Policy>});
         }
         }
@@ -404,7 +404,7 @@ public:
                     /* this is never static */
                     /* this is never static */
                     internal::meta_traits::is_const,
                     internal::meta_traits::is_const,
                     0u,
                     0u,
-                    &internal::resolve<std::remove_const_t<std::remove_reference_t<typename descriptor::return_type>>>,
+                    &internal::resolve<std::remove_cvref_t<typename descriptor::return_type>>,
                     &meta_arg<type_list<>>,
                     &meta_arg<type_list<>>,
                     &meta_setter<Type, Setter>,
                     &meta_setter<Type, Setter>,
                     &meta_getter<Type, Getter, Policy>});
                     &meta_getter<Type, Getter, Policy>});
@@ -418,7 +418,7 @@ public:
                     /* this is never static nor const */
                     /* this is never static nor const */
                     internal::meta_traits::is_none,
                     internal::meta_traits::is_none,
                     1u,
                     1u,
-                    &internal::resolve<std::remove_const_t<std::remove_reference_t<typename descriptor::return_type>>>,
+                    &internal::resolve<std::remove_cvref_t<typename descriptor::return_type>>,
                     &meta_arg<type_list<type_list_element_t<static_cast<std::size_t>(args_type::size != 1u), args_type>>>,
                     &meta_arg<type_list<type_list_element_t<static_cast<std::size_t>(args_type::size != 1u), args_type>>>,
                     &meta_setter<Type, Setter>,
                     &meta_setter<Type, Setter>,
                     &meta_getter<Type, Getter, Policy>});
                     &meta_getter<Type, Getter, Policy>});
@@ -464,7 +464,7 @@ public:
                 name,
                 name,
                 (descriptor::is_const ? internal::meta_traits::is_const : internal::meta_traits::is_none) | (descriptor::is_static ? internal::meta_traits::is_static : internal::meta_traits::is_none),
                 (descriptor::is_const ? internal::meta_traits::is_const : internal::meta_traits::is_none) | (descriptor::is_static ? internal::meta_traits::is_static : internal::meta_traits::is_none),
                 descriptor::args_type::size,
                 descriptor::args_type::size,
-                &internal::resolve<std::conditional_t<std::is_same_v<Policy, as_void_t>, void, std::remove_const_t<std::remove_reference_t<typename descriptor::return_type>>>>,
+                &internal::resolve<std::conditional_t<std::is_same_v<Policy, as_void_t>, void, std::remove_cvref_t<typename descriptor::return_type>>>,
                 &meta_arg<typename descriptor::args_type>,
                 &meta_arg<typename descriptor::args_type>,
                 &meta_invoke<Type, Candidate, Policy>});
                 &meta_invoke<Type, Candidate, Policy>});
 
 

+ 10 - 10
src/entt/meta/meta.hpp

@@ -51,7 +51,7 @@ public:
         : ctx{&area},
         : ctx{&area},
           data{&instance},
           data{&instance},
           value_type_node{&internal::resolve<typename Type::value_type>},
           value_type_node{&internal::resolve<typename Type::value_type>},
-          const_reference_node{&internal::resolve<std::remove_const_t<std::remove_reference_t<typename Type::const_reference>>>},
+          const_reference_node{&internal::resolve<std::remove_cvref_t<typename Type::const_reference>>},
           size_fn{meta_sequence_container_traits<std::remove_const_t<Type>>::size},
           size_fn{meta_sequence_container_traits<std::remove_const_t<Type>>::size},
           clear_fn{meta_sequence_container_traits<std::remove_const_t<Type>>::clear},
           clear_fn{meta_sequence_container_traits<std::remove_const_t<Type>>::clear},
           reserve_fn{meta_sequence_container_traits<std::remove_const_t<Type>>::reserve},
           reserve_fn{meta_sequence_container_traits<std::remove_const_t<Type>>::reserve},
@@ -161,7 +161,7 @@ class meta_any {
 
 
     template<typename Type>
     template<typename Type>
     static void basic_vtable(const internal::meta_traits req, const meta_any &value, [[maybe_unused]] const void *other) {
     static void basic_vtable(const internal::meta_traits req, const meta_any &value, [[maybe_unused]] const void *other) {
-        static_assert(std::is_same_v<std::remove_const_t<std::remove_reference_t<Type>>, Type>, "Invalid type");
+        static_assert(std::is_same_v<std::remove_cvref_t<Type>, Type>, "Invalid type");
 
 
         if(req == internal::meta_traits::is_none) {
         if(req == internal::meta_traits::is_none) {
             value.node = &internal::resolve<Type>(internal::meta_context::from(*value.ctx));
             value.node = &internal::resolve<Type>(internal::meta_context::from(*value.ctx));
@@ -248,7 +248,7 @@ public:
     explicit meta_any(const meta_ctx &area, std::in_place_type_t<Type>, Args &&...args)
     explicit meta_any(const meta_ctx &area, std::in_place_type_t<Type>, Args &&...args)
         : storage{std::in_place_type<Type>, std::forward<Args>(args)...},
         : storage{std::in_place_type<Type>, std::forward<Args>(args)...},
           ctx{&area},
           ctx{&area},
-          vtable{&basic_vtable<std::remove_const_t<std::remove_reference_t<Type>>>} {}
+          vtable{&basic_vtable<std::remove_cvref_t<Type>>} {}
 
 
     /**
     /**
      * @brief Constructs a wrapper taking ownership of the passed object.
      * @brief Constructs a wrapper taking ownership of the passed object.
@@ -470,22 +470,22 @@ public:
     template<typename Type>
     template<typename Type>
     [[nodiscard]] meta_any allow_cast() const {
     [[nodiscard]] meta_any allow_cast() const {
         if constexpr(!std::is_reference_v<Type> || std::is_const_v<std::remove_reference_t<Type>>) {
         if constexpr(!std::is_reference_v<Type> || std::is_const_v<std::remove_reference_t<Type>>) {
-            if(storage.has_value<std::remove_const_t<std::remove_reference_t<Type>>>()) {
+            if(storage.has_value<std::remove_cvref_t<Type>>()) {
                 return as_ref();
                 return as_ref();
             } else if(*this) {
             } else if(*this) {
-                if constexpr(std::is_arithmetic_v<std::remove_const_t<std::remove_reference_t<Type>>> || std::is_enum_v<std::remove_const_t<std::remove_reference_t<Type>>>) {
+                if constexpr(std::is_arithmetic_v<std::remove_cvref_t<Type>> || std::is_enum_v<std::remove_cvref_t<Type>>) {
                     if(const auto &from = fetch_node(); from.conversion_helper) {
                     if(const auto &from = fetch_node(); from.conversion_helper) {
                         return meta_any{*ctx, static_cast<Type>(from.conversion_helper(nullptr, storage.data()))};
                         return meta_any{*ctx, static_cast<Type>(from.conversion_helper(nullptr, storage.data()))};
                     }
                     }
                 }
                 }
 
 
                 if(const auto &from = fetch_node(); from.details != nullptr) {
                 if(const auto &from = fetch_node(); from.details != nullptr) {
-                    if(const auto *elem = internal::find_member<&internal::meta_conv_node::type>(from.details->conv, entt::type_hash<std::remove_const_t<std::remove_reference_t<Type>>>::value()); elem != nullptr) {
+                    if(const auto *elem = internal::find_member<&internal::meta_conv_node::type>(from.details->conv, entt::type_hash<std::remove_cvref_t<Type>>::value()); elem != nullptr) {
                         return elem->conv(*ctx, storage.data());
                         return elem->conv(*ctx, storage.data());
                     }
                     }
 
 
                     for(auto &&curr: from.details->base) {
                     for(auto &&curr: from.details->base) {
-                        if(auto other = curr.resolve(internal::meta_context::from(*ctx)).from_void(*ctx, nullptr, curr.cast(storage.data())); curr.type == entt::type_hash<std::remove_const_t<std::remove_reference_t<Type>>>::value()) {
+                        if(auto other = curr.resolve(internal::meta_context::from(*ctx)).from_void(*ctx, nullptr, curr.cast(storage.data())); curr.type == entt::type_hash<std::remove_cvref_t<Type>>::value()) {
                             return other;
                             return other;
                         } else if(auto from_base = std::as_const(other).template allow_cast<Type>(); from_base) {
                         } else if(auto from_base = std::as_const(other).template allow_cast<Type>(); from_base) {
                             return from_base;
                             return from_base;
@@ -508,9 +508,9 @@ public:
         if constexpr(std::is_reference_v<Type> && !std::is_const_v<std::remove_reference_t<Type>>) {
         if constexpr(std::is_reference_v<Type> && !std::is_const_v<std::remove_reference_t<Type>>) {
             return allow_cast<const std::remove_reference_t<Type> &>() && (storage.policy() != any_policy::cref);
             return allow_cast<const std::remove_reference_t<Type> &>() && (storage.policy() != any_policy::cref);
         } else {
         } else {
-            if(storage.has_value<std::remove_const_t<std::remove_reference_t<Type>>>()) {
+            if(storage.has_value<std::remove_cvref_t<Type>>()) {
                 return true;
                 return true;
-            } else if(auto other = std::as_const(*this).allow_cast<std::remove_const_t<std::remove_reference_t<Type>>>(); other) {
+            } else if(auto other = std::as_const(*this).allow_cast<std::remove_cvref_t<Type>>(); other) {
                 if(other.storage.owner()) {
                 if(other.storage.owner()) {
                     std::swap(*this, other);
                     std::swap(*this, other);
                 }
                 }
@@ -526,7 +526,7 @@ public:
     template<typename Type, typename... Args>
     template<typename Type, typename... Args>
     void emplace(Args &&...args) {
     void emplace(Args &&...args) {
         storage.emplace<Type>(std::forward<Args>(args)...);
         storage.emplace<Type>(std::forward<Args>(args)...);
-        auto *prev = std::exchange(vtable, &basic_vtable<std::remove_const_t<std::remove_reference_t<Type>>>);
+        auto *prev = std::exchange(vtable, &basic_vtable<std::remove_cvref_t<Type>>);
         node = (prev == vtable) ? node : nullptr;
         node = (prev == vtable) ? node : nullptr;
     }
     }
 
 

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

@@ -192,7 +192,7 @@ const meta_type_node &resolve(const meta_context &) noexcept;
 template<typename... Args>
 template<typename... Args>
 [[nodiscard]] const meta_type_node &meta_arg_node(const meta_context &context, type_list<Args...>, const std::size_t index) noexcept {
 [[nodiscard]] const meta_type_node &meta_arg_node(const meta_context &context, type_list<Args...>, const std::size_t index) noexcept {
     using resolve_type = const meta_type_node &(*)(const meta_context &) noexcept;
     using resolve_type = const meta_type_node &(*)(const meta_context &) noexcept;
-    constexpr std::array<resolve_type, sizeof...(Args)> list{&resolve<std::remove_const_t<std::remove_reference_t<Args>>>...};
+    constexpr std::array<resolve_type, sizeof...(Args)> list{&resolve<std::remove_cvref_t<Args>>...};
     ENTT_ASSERT(index < sizeof...(Args), "Out of bounds");
     ENTT_ASSERT(index < sizeof...(Args), "Out of bounds");
     return list[index](context);
     return list[index](context);
 }
 }
@@ -278,7 +278,7 @@ auto setup_node_for() noexcept {
 
 
 template<typename Type>
 template<typename Type>
 [[nodiscard]] const meta_type_node &resolve(const meta_context &context) noexcept {
 [[nodiscard]] const meta_type_node &resolve(const meta_context &context) noexcept {
-    static_assert(std::is_same_v<Type, std::remove_const_t<std::remove_reference_t<Type>>>, "Invalid type");
+    static_assert(std::is_same_v<Type, std::remove_cvref_t<Type>>, "Invalid type");
     static const meta_type_node node = setup_node_for<Type>();
     static const meta_type_node node = setup_node_for<Type>();
     const auto *elem = try_resolve(context, *node.info);
     const auto *elem = try_resolve(context, *node.info);
     return (elem == nullptr) ? node : *elem;
     return (elem == nullptr) ? node : *elem;

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

@@ -20,7 +20,7 @@ namespace entt {
 template<typename Type>
 template<typename Type>
 [[nodiscard]] meta_type resolve(const meta_ctx &ctx) noexcept {
 [[nodiscard]] meta_type resolve(const meta_ctx &ctx) noexcept {
     const auto &context = internal::meta_context::from(ctx);
     const auto &context = internal::meta_context::from(ctx);
-    return {ctx, internal::resolve<std::remove_const_t<std::remove_reference_t<Type>>>(context)};
+    return {ctx, internal::resolve<std::remove_cvref_t<Type>>(context)};
 }
 }
 
 
 /**
 /**

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

@@ -93,11 +93,11 @@ struct meta_function_descriptor<Type, Ret (*)(MaybeType, Args...)>
     : meta_function_descriptor_traits<
     : meta_function_descriptor_traits<
           Ret,
           Ret,
           std::conditional_t<
           std::conditional_t<
-              std::is_same_v<std::remove_const_t<std::remove_reference_t<MaybeType>>, Type> || std::is_base_of_v<std::remove_const_t<std::remove_reference_t<MaybeType>>, Type>,
+              std::is_same_v<std::remove_cvref_t<MaybeType>, Type> || std::is_base_of_v<std::remove_cvref_t<MaybeType>, Type>,
               type_list<Args...>,
               type_list<Args...>,
               type_list<MaybeType, Args...>>,
               type_list<MaybeType, Args...>>,
-          !(std::is_same_v<std::remove_const_t<std::remove_reference_t<MaybeType>>, Type> || std::is_base_of_v<std::remove_const_t<std::remove_reference_t<MaybeType>>, Type>),
-          std::is_const_v<std::remove_reference_t<MaybeType>> && (std::is_same_v<std::remove_const_t<std::remove_reference_t<MaybeType>>, Type> || std::is_base_of_v<std::remove_const_t<std::remove_reference_t<MaybeType>>, Type>)> {};
+          !(std::is_same_v<std::remove_cvref_t<MaybeType>, Type> || std::is_base_of_v<std::remove_cvref_t<MaybeType>, Type>),
+          std::is_const_v<std::remove_reference_t<MaybeType>> && (std::is_same_v<std::remove_cvref_t<MaybeType>, Type> || std::is_base_of_v<std::remove_cvref_t<MaybeType>, Type>)> {};
 
 
 /**
 /**
  * @brief Meta function descriptor.
  * @brief Meta function descriptor.
@@ -316,7 +316,7 @@ template<typename Type, auto Data>
 template<typename Type, auto Data, typename Policy = as_value_t>
 template<typename Type, auto Data, typename Policy = as_value_t>
 [[nodiscard]] std::enable_if_t<is_meta_policy_v<Policy>, meta_any> meta_getter(meta_handle instance) {
 [[nodiscard]] std::enable_if_t<is_meta_policy_v<Policy>, meta_any> meta_getter(meta_handle instance) {
     if constexpr(std::is_member_pointer_v<decltype(Data)> || std::is_function_v<std::remove_reference_t<std::remove_pointer_t<decltype(Data)>>>) {
     if constexpr(std::is_member_pointer_v<decltype(Data)> || std::is_function_v<std::remove_reference_t<std::remove_pointer_t<decltype(Data)>>>) {
-        if constexpr(!std::is_array_v<std::remove_const_t<std::remove_reference_t<std::invoke_result_t<decltype(Data), Type &>>>>) {
+        if constexpr(!std::is_array_v<std::remove_cvref_t<std::invoke_result_t<decltype(Data), Type &>>>) {
             if constexpr(std::is_invocable_v<decltype(Data), Type &>) {
             if constexpr(std::is_invocable_v<decltype(Data), Type &>) {
                 if(auto *clazz = instance->try_cast<Type>(); clazz) {
                 if(auto *clazz = instance->try_cast<Type>(); clazz) {
                     return meta_dispatch<Policy>(instance->context(), std::invoke(Data, *clazz));
                     return meta_dispatch<Policy>(instance->context(), std::invoke(Data, *clazz));
@@ -418,7 +418,7 @@ template<typename Type, typename... Args>
  */
  */
 template<typename Type, typename Policy = as_value_t, typename Candidate>
 template<typename Type, typename Policy = as_value_t, typename Candidate>
 [[nodiscard]] meta_any meta_construct(const meta_ctx &ctx, Candidate &&candidate, meta_any *const args) {
 [[nodiscard]] meta_any meta_construct(const meta_ctx &ctx, Candidate &&candidate, meta_any *const args) {
-    if constexpr(meta_function_helper_t<Type, Candidate>::is_static || std::is_class_v<std::remove_const_t<std::remove_reference_t<Candidate>>>) {
+    if constexpr(meta_function_helper_t<Type, Candidate>::is_static || std::is_class_v<std::remove_cvref_t<Candidate>>) {
         meta_any placeholder{meta_ctx_arg, ctx};
         meta_any placeholder{meta_ctx_arg, ctx};
         return internal::meta_invoke<Type, Policy>(placeholder, std::forward<Candidate>(candidate), args, std::make_index_sequence<meta_function_helper_t<Type, std::remove_reference_t<Candidate>>::args_type::size>{});
         return internal::meta_invoke<Type, Policy>(placeholder, std::forward<Candidate>(candidate), args, std::make_index_sequence<meta_function_helper_t<Type, std::remove_reference_t<Candidate>>::args_type::size>{});
     } else {
     } else {

+ 4 - 4
src/entt/poly/poly.hpp

@@ -211,16 +211,16 @@ public:
     template<typename Type, typename... Args>
     template<typename Type, typename... Args>
     explicit basic_poly(std::in_place_type_t<Type>, Args &&...args)
     explicit basic_poly(std::in_place_type_t<Type>, Args &&...args)
         : storage{std::in_place_type<Type>, std::forward<Args>(args)...},
         : storage{std::in_place_type<Type>, std::forward<Args>(args)...},
-          vtable{poly_vtable<Concept, Len, Align>::template instance<std::remove_const_t<std::remove_reference_t<Type>>>()} {}
+          vtable{poly_vtable<Concept, Len, Align>::template instance<std::remove_cvref_t<Type>>()} {}
 
 
     /**
     /**
      * @brief Constructs a poly from a given value.
      * @brief Constructs a poly from a given value.
      * @tparam Type Type of object to use to initialize the poly.
      * @tparam Type Type of object to use to initialize the poly.
      * @param value An instance of an object to use to initialize the poly.
      * @param value An instance of an object to use to initialize the poly.
      */
      */
-    template<typename Type, typename = std::enable_if_t<!std::is_same_v<std::remove_const_t<std::remove_reference_t<Type>>, basic_poly>>>
+    template<typename Type, typename = std::enable_if_t<!std::is_same_v<std::remove_cvref_t<Type>, basic_poly>>>
     basic_poly(Type &&value) noexcept
     basic_poly(Type &&value) noexcept
-        : basic_poly{std::in_place_type<std::remove_const_t<std::remove_reference_t<Type>>>, std::forward<Type>(value)} {}
+        : basic_poly{std::in_place_type<std::remove_cvref_t<Type>>, std::forward<Type>(value)} {}
 
 
     /**
     /**
      * @brief Returns the object type info if any, `type_id<void>()` otherwise.
      * @brief Returns the object type info if any, `type_id<void>()` otherwise.
@@ -252,7 +252,7 @@ public:
     template<typename Type, typename... Args>
     template<typename Type, typename... Args>
     void emplace(Args &&...args) {
     void emplace(Args &&...args) {
         storage.template emplace<Type>(std::forward<Args>(args)...);
         storage.template emplace<Type>(std::forward<Args>(args)...);
-        vtable = poly_vtable<Concept, Len, Align>::template instance<std::remove_const_t<std::remove_reference_t<Type>>>();
+        vtable = poly_vtable<Concept, Len, Align>::template instance<std::remove_cvref_t<Type>>();
     }
     }
 
 
     /*! @brief Destroys contained object */
     /*! @brief Destroys contained object */

+ 2 - 2
src/entt/signal/emitter.hpp

@@ -147,7 +147,7 @@ public:
      */
      */
     template<typename Type>
     template<typename Type>
     void erase() {
     void erase() {
-        handlers.first().erase(type_hash<std::remove_const_t<std::remove_reference_t<Type>>>::value());
+        handlers.first().erase(type_hash<std::remove_cvref_t<Type>>::value());
     }
     }
 
 
     /*! @brief Disconnects all the listeners. */
     /*! @brief Disconnects all the listeners. */
@@ -162,7 +162,7 @@ public:
      */
      */
     template<typename Type>
     template<typename Type>
     [[nodiscard]] bool contains() const {
     [[nodiscard]] bool contains() const {
-        return handlers.first().contains(type_hash<std::remove_const_t<std::remove_reference_t<Type>>>::value());
+        return handlers.first().contains(type_hash<std::remove_cvref_t<Type>>::value());
     }
     }
 
 
     /**
     /**