Skip to content

Commit 596049e

Browse files
burblebeetkoeppe
authored andcommitted
LWG3446 indirectly_readable_traits ambiguity for types with both value_type and element_type
1 parent fd5c645 commit 596049e

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

source/iterators.tex

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,12 @@
745745
using value_type = remove_cv_t<T>;
746746
};
747747

748+
template<class T>
749+
concept @\defexposconcept{has-member-value-type}@ = requires { typename T::value_type; }; // \expos
750+
751+
template<class T>
752+
concept @\defexposconcept{has-member-element-type}@ = requires { typename T::element_type; }; // \expos
753+
748754
template<class> struct indirectly_readable_traits { };
749755

750756
template<class T>
@@ -761,16 +767,20 @@
761767
struct indirectly_readable_traits<const I>
762768
: indirectly_readable_traits<I> { };
763769

764-
template<class T>
765-
requires requires { typename T::value_type; }
770+
template<@\exposconcept{has-member-value-type}@ T>
766771
struct indirectly_readable_traits<T>
767772
: @\placeholder{cond-value-type}@<typename T::value_type> { };
768773

769-
template<class T>
770-
requires requires { typename T::element_type; }
774+
template<@\exposconcept{has-member-element-type}@ T>
771775
struct indirectly_readable_traits<T>
772776
: @\placeholder{cond-value-type}@<typename T::element_type> { };
773777

778+
template<@\exposconcept{has-member-value-type}@ T>
779+
requires @\exposconcept{has-member-element-type}@<T> &&
780+
@\libconcept{same_as}@<remove_cv_t<typename T::element_type>, remove_cv_t<typename T::value_type>>
781+
struct indirectly_readable_traits<T>
782+
: @\placeholder{cond-value-type}@<typename T::value_type> { };
783+
774784
template<class T> using iter_value_t = @\seebelow@;
775785
\end{codeblock}
776786

0 commit comments

Comments
 (0)