diff --git a/headers/meta.hpp/meta_utilities.hpp b/headers/meta.hpp/meta_utilities.hpp index 8d4eac5..522233d 100644 --- a/headers/meta.hpp/meta_utilities.hpp +++ b/headers/meta.hpp/meta_utilities.hpp @@ -93,7 +93,6 @@ namespace meta_hpp::detail public: noncopyable(noncopyable&&) = delete; noncopyable(const noncopyable&) = delete; - noncopyable& operator=(noncopyable&&) = delete; noncopyable& operator=(const noncopyable&) = delete; }; @@ -115,10 +114,12 @@ namespace meta_hpp ~value() = default; - template < detail::decay_non_uvalue_kind T > + template < detail::decay_non_uvalue_kind T, typename Tp = std::decay_t > + requires detail::stdex::copy_constructible explicit value(T&& val); - template < detail::decay_non_uvalue_kind T > + template < detail::decay_non_uvalue_kind T, typename Tp = std::decay_t > + requires detail::stdex::copy_constructible value& operator=(T&& val); void swap(value& other) noexcept; diff --git a/headers/meta.hpp/meta_utilities/value.hpp b/headers/meta.hpp/meta_utilities/value.hpp index 24c6e82..571a61f 100644 --- a/headers/meta.hpp/meta_utilities/value.hpp +++ b/headers/meta.hpp/meta_utilities/value.hpp @@ -154,12 +154,14 @@ namespace meta_hpp return *this; } - template < detail::decay_non_uvalue_kind T > + template < detail::decay_non_uvalue_kind T, typename Tp > + requires detail::stdex::copy_constructible value::value(T&& val) : raw_{std::forward(val)} , traits_{traits::get>()} {} - template < detail::decay_non_uvalue_kind T > + template < detail::decay_non_uvalue_kind T, typename Tp > + requires detail::stdex::copy_constructible value& value::operator=(T&& val) { value temp{std::forward(val)}; swap(temp); @@ -241,14 +243,14 @@ namespace meta_hpp namespace meta_hpp { - template < typename T > + template < detail::has_value_less_traits T > [[nodiscard]] bool operator<(const value& l, const T& r) { const any_type& r_type = resolve_type(); return (l.get_type() < r_type) || (l.get_type() == r_type && std::less<>{}(l.cast(), r)); } - template < typename T > + template < detail::has_value_less_traits T > [[nodiscard]] bool operator<(const T& l, const value& r) { const any_type& l_type = resolve_type(); return (l_type < r.get_type()) @@ -263,13 +265,13 @@ namespace meta_hpp namespace meta_hpp { - template < typename T > + template < detail::has_value_equals_traits T > [[nodiscard]] bool operator==(const value& l, const T& r) { return l.get_type() == resolve_type() && std::equal_to<>{}(l.cast(), r); } - template < typename T > + template < detail::has_value_equals_traits T > [[nodiscard]] bool operator==(const T& l, const value& r) { return resolve_type() == r.get_type() && std::equal_to<>{}(l, r.cast());