diff --git a/source/iterators.tex b/source/iterators.tex index efaba781c2..390a1e45d6 100644 --- a/source/iterators.tex +++ b/source/iterators.tex @@ -84,9 +84,12 @@ template concept indirectly_readable = @\seebelow@; // freestanding + template<@\libconcept{indirectly_readable}@ T> + using @\exposidnc{indirect-value-t}@ = @\seebelow@; // \expos + template<@\libconcept{indirectly_readable}@ T> using @\libglobal{iter_common_reference_t}@ = // freestanding - common_reference_t, iter_value_t&>; + common_reference_t, @\exposid{indirect-value-t}@>; // \ref{iterator.concept.writable}, concept \libconcept{indirectly_writable} template @@ -2411,6 +2414,21 @@ There are several concepts that group requirements of algorithms that take callable objects\iref{func.def} as arguments. +\rSec3[indirectcallable.traits]{Indirect callable traits} + +\pnum +To implement algorithms taking projections, +it is necessary to determine the projected type of an iterator's value type. +For the exposition-only alias template \exposid{indirect-value-t}, +\tcode{\exposid{indirect-value-t}} denotes +\begin{itemize} +\item +\tcode{invoke_result_t>} +if \tcode{T} names \tcode{projected}, and +\item +\tcode{iter_value_t\&} otherwise. +\end{itemize} + \rSec3[indirectcallable.indirectinvocable]{Indirect callables} \pnum @@ -2423,29 +2441,29 @@ concept @\deflibconcept{indirectly_unary_invocable}@ = @\libconcept{indirectly_readable}@ && @\libconcept{copy_constructible}@ && - @\libconcept{invocable}@&> && + @\libconcept{invocable}@> && @\libconcept{invocable}@> && @\libconcept{invocable}@> && @\libconcept{common_reference_with}@< - invoke_result_t&>, + invoke_result_t>, invoke_result_t>>; template concept @\deflibconcept{indirectly_regular_unary_invocable}@ = @\libconcept{indirectly_readable}@ && @\libconcept{copy_constructible}@ && - @\libconcept{regular_invocable}@&> && + @\libconcept{regular_invocable}@> && @\libconcept{regular_invocable}@> && @\libconcept{regular_invocable}@> && @\libconcept{common_reference_with}@< - invoke_result_t&>, + invoke_result_t>, invoke_result_t>>; template concept @\deflibconcept{indirect_unary_predicate}@ = @\libconcept{indirectly_readable}@ && @\libconcept{copy_constructible}@ && - @\libconcept{predicate}@&> && + @\libconcept{predicate}@> && @\libconcept{predicate}@> && @\libconcept{predicate}@>; @@ -2453,9 +2471,9 @@ concept @\deflibconcept{indirect_binary_predicate}@ = @\libconcept{indirectly_readable}@ && @\libconcept{indirectly_readable}@ && @\libconcept{copy_constructible}@ && - @\libconcept{predicate}@&, iter_value_t&> && - @\libconcept{predicate}@&, iter_reference_t> && - @\libconcept{predicate}@, iter_value_t&> && + @\libconcept{predicate}@, @\exposid{indirect-value-t}@> && + @\libconcept{predicate}@, iter_reference_t> && + @\libconcept{predicate}@, @\exposid{indirect-value-t}@> && @\libconcept{predicate}@, iter_reference_t> && @\libconcept{predicate}@, iter_common_reference_t>; @@ -2463,9 +2481,9 @@ concept @\deflibconcept{indirect_equivalence_relation}@ = @\libconcept{indirectly_readable}@ && @\libconcept{indirectly_readable}@ && @\libconcept{copy_constructible}@ && - @\libconcept{equivalence_relation}@&, iter_value_t&> && - @\libconcept{equivalence_relation}@&, iter_reference_t> && - @\libconcept{equivalence_relation}@, iter_value_t&> && + @\libconcept{equivalence_relation}@, @\exposid{indirect-value-t}@> && + @\libconcept{equivalence_relation}@, iter_reference_t> && + @\libconcept{equivalence_relation}@, @\exposid{indirect-value-t}@&> && @\libconcept{equivalence_relation}@, iter_reference_t> && @\libconcept{equivalence_relation}@, iter_common_reference_t>; @@ -2473,9 +2491,9 @@ concept @\deflibconcept{indirect_strict_weak_order}@ = @\libconcept{indirectly_readable}@ && @\libconcept{indirectly_readable}@ && @\libconcept{copy_constructible}@ && - @\libconcept{strict_weak_order}@&, iter_value_t&> && - @\libconcept{strict_weak_order}@&, iter_reference_t> && - @\libconcept{strict_weak_order}@, iter_value_t&> && + @\libconcept{strict_weak_order}@, @\exposid{indirect-value-t}@> && + @\libconcept{strict_weak_order}@, iter_reference_t> && + @\libconcept{strict_weak_order}@, @\exposid{indirect-value-t}@> && @\libconcept{strict_weak_order}@, iter_reference_t> && @\libconcept{strict_weak_order}@, iter_common_reference_t>; } diff --git a/source/support.tex b/source/support.tex index 3d0163861b..8015ac249e 100644 --- a/source/support.tex +++ b/source/support.tex @@ -682,7 +682,7 @@ #define @\defnlibxname{cpp_lib_polymorphic_allocator}@ 201902L // also in \libheader{memory_resource} #define @\defnlibxname{cpp_lib_print}@ 202207L // also in \libheader{print}, \libheader{ostream} #define @\defnlibxname{cpp_lib_quoted_string_io}@ 201304L // also in \libheader{iomanip} -#define @\defnlibxname{cpp_lib_ranges}@ 202211L +#define @\defnlibxname{cpp_lib_ranges}@ 202302L // also in \libheader{algorithm}, \libheader{functional}, \libheader{iterator}, \libheader{memory}, \libheader{ranges} #define @\defnlibxname{cpp_lib_ranges_as_const}@ 202207L // also in \libheader{ranges} #define @\defnlibxname{cpp_lib_ranges_as_rvalue}@ 202207L // also in \libheader{ranges}