From bb841f20ffb386dcb45981bc4db0b1f2da404a08 Mon Sep 17 00:00:00 2001 From: Ben Deane Date: Mon, 6 Jul 2026 11:09:46 -0600 Subject: [PATCH] :bug: Fix `same_as_unqualified` Problem: - Concept subsumption niceties mean that `std::same_as` has to be implemented using a helper concept that checks things both ways around. `same_as_unqualified` doesn't do this same thing. Solution: - Implement `same_as_unqualified` in terms of `same_as`. --- include/stdx/concepts.hpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/include/stdx/concepts.hpp b/include/stdx/concepts.hpp index 17414b9..ea09f8b 100644 --- a/include/stdx/concepts.hpp +++ b/include/stdx/concepts.hpp @@ -35,8 +35,13 @@ concept derived_from = std::is_base_of_v and std::is_convertible_v; +namespace detail { +template +concept same_as_helper = std::is_same_v; +} + template -concept same_as = std::is_same_v and std::is_same_v; +concept same_as = detail::same_as_helper and detail::same_as_helper; template constexpr auto same_any = (... or same_as); @@ -45,8 +50,7 @@ template constexpr auto same_none = not same_any; template -concept same_as_unqualified = - is_same_unqualified_v and is_same_unqualified_v; +concept same_as_unqualified = same_as, remove_cvref_t>; template concept equality_comparable = requires(T const &t) { @@ -133,8 +137,7 @@ template typename TypeTrait> concept has_trait = TypeTrait::value; template -concept same_as_unqualified = - is_same_unqualified_v and is_same_unqualified_v; +concept same_as_unqualified = same_as, remove_cvref_t>; template concept structural = is_structural_v;