Skip to content

Commit d421400

Browse files
committed
P2609R3 Relaxing Ranges Just A Smidge
Fixes NB US 39-099 (C++23 CD).
1 parent 9ce105b commit d421400

File tree

2 files changed

+32
-15
lines changed

2 files changed

+32
-15
lines changed

source/iterators.tex

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,12 @@
8484
template<class In>
8585
concept indirectly_readable = @\seebelow@; // freestanding
8686

87+
template<@\libconcept{indirectly_readable}@ T>
88+
using @\exposidnc{indirect-value-t}@ = @\seebelow@; // \expos
89+
8790
template<@\libconcept{indirectly_readable}@ T>
8891
using @\libglobal{iter_common_reference_t}@ = // freestanding
89-
common_reference_t<iter_reference_t<T>, iter_value_t<T>&>;
92+
common_reference_t<iter_reference_t<T>, @\exposid{indirect-value-t}@<T>>;
9093

9194
// \ref{iterator.concept.writable}, concept \libconcept{indirectly_writable}
9295
template<class Out, class T>
@@ -2408,6 +2411,20 @@
24082411
There are several concepts that group requirements of algorithms that
24092412
take callable objects\iref{func.def} as arguments.
24102413

2414+
\rSec3[indirectcallable.traits]{Indirect callable traits}
2415+
2416+
\pnum
2417+
To implement algorithms taking projections,
2418+
it is necessary to determine the projected type of an iterators value type.
2419+
The exposition-only alias template \tcode{indirect-value-t<T>} denotes
2420+
\begin{itemize}
2421+
\item
2422+
\tcode{invoke_result_t<Proj\&, \exposid{indirect-value-t}<I>>}
2423+
if \tcode{T} names \tcode{projected<I, Proj>}, and
2424+
\item
2425+
\tcode{iter_value_t<T>\&} otherwise.
2426+
\end{itemize}
2427+
24112428
\rSec3[indirectcallable.indirectinvocable]{Indirect callables}
24122429

24132430
\pnum
@@ -2420,48 +2437,48 @@
24202437
concept @\deflibconcept{indirectly_unary_invocable}@ =
24212438
@\libconcept{indirectly_readable}@<I> &&
24222439
@\libconcept{copy_constructible}@<F> &&
2423-
@\libconcept{invocable}@<F&, iter_value_t<I>&> &&
2440+
@\libconcept{invocable}@<F&, @\exposid{indirect-value-t}@<I>> &&
24242441
@\libconcept{invocable}@<F&, iter_reference_t<I>> &&
24252442
@\libconcept{invocable}@<F&, iter_common_reference_t<I>> &&
24262443
@\libconcept{common_reference_with}@<
2427-
invoke_result_t<F&, iter_value_t<I>&>,
2444+
invoke_result_t<F&, @\exposid{indirect-value-t}@<I>>,
24282445
invoke_result_t<F&, iter_reference_t<I>>>;
24292446

24302447
template<class F, class I>
24312448
concept @\deflibconcept{indirectly_regular_unary_invocable}@ =
24322449
@\libconcept{indirectly_readable}@<I> &&
24332450
@\libconcept{copy_constructible}@<F> &&
2434-
@\libconcept{regular_invocable}@<F&, iter_value_t<I>&> &&
2451+
@\libconcept{regular_invocable}@<F&, @\exposid{indirect-value-t}@<I>> &&
24352452
@\libconcept{regular_invocable}@<F&, iter_reference_t<I>> &&
24362453
@\libconcept{regular_invocable}@<F&, iter_common_reference_t<I>> &&
24372454
@\libconcept{common_reference_with}@<
2438-
invoke_result_t<F&, iter_value_t<I>&>,
2455+
invoke_result_t<F&, @\exposid{indirect-value-t}@<I>>,
24392456
invoke_result_t<F&, iter_reference_t<I>>>;
24402457

24412458
template<class F, class I>
24422459
concept @\deflibconcept{indirect_unary_predicate}@ =
24432460
@\libconcept{indirectly_readable}@<I> &&
24442461
@\libconcept{copy_constructible}@<F> &&
2445-
@\libconcept{predicate}@<F&, iter_value_t<I>&> &&
2462+
@\libconcept{predicate}@<F&, @\exposid{indirect-value-t}@<I>> &&
24462463
@\libconcept{predicate}@<F&, iter_reference_t<I>> &&
24472464
@\libconcept{predicate}@<F&, iter_common_reference_t<I>>;
24482465

24492466
template<class F, class I1, class I2>
24502467
concept @\deflibconcept{indirect_binary_predicate}@ =
24512468
@\libconcept{indirectly_readable}@<I1> && @\libconcept{indirectly_readable}@<I2> &&
24522469
@\libconcept{copy_constructible}@<F> &&
2453-
@\libconcept{predicate}@<F&, iter_value_t<I1>&, iter_value_t<I2>&> &&
2454-
@\libconcept{predicate}@<F&, iter_value_t<I1>&, iter_reference_t<I2>> &&
2455-
@\libconcept{predicate}@<F&, iter_reference_t<I1>, iter_value_t<I2>&> &&
2470+
@\libconcept{predicate}@<F&, @\exposid{indirect-value-t}@<I1>, @\exposid{indirect-value-t}@<I2>> &&
2471+
@\libconcept{predicate}@<F&, @\exposid{indirect-value-t}@<I1>, iter_reference_t<I2>> &&
2472+
@\libconcept{predicate}@<F&, iter_reference_t<I1>, @\exposid{indirect-value-t}@<I2>> &&
24562473
@\libconcept{predicate}@<F&, iter_reference_t<I1>, iter_reference_t<I2>> &&
24572474
@\libconcept{predicate}@<F&, iter_common_reference_t<I1>, iter_common_reference_t<I2>>;
24582475

24592476
template<class F, class I1, class I2 = I1>
24602477
concept @\deflibconcept{indirect_equivalence_relation}@ =
24612478
@\libconcept{indirectly_readable}@<I1> && @\libconcept{indirectly_readable}@<I2> &&
24622479
@\libconcept{copy_constructible}@<F> &&
2463-
@\libconcept{equivalence_relation}@<F&, iter_value_t<I1>&, iter_value_t<I2>&> &&
2464-
@\libconcept{equivalence_relation}@<F&, iter_value_t<I1>&, iter_reference_t<I2>> &&
2480+
@\libconcept{equivalence_relation}@<F&, @\exposid{indirect-value-t}@<I1>, @\exposid{indirect-value-t}@<I2>> &&
2481+
@\libconcept{equivalence_relation}@<F&, @\exposid{indirect-value-t}@<I1>, iter_reference_t<I2>> &&
24652482
@\libconcept{equivalence_relation}@<F&, iter_reference_t<I1>, iter_value_t<I2>&> &&
24662483
@\libconcept{equivalence_relation}@<F&, iter_reference_t<I1>, iter_reference_t<I2>> &&
24672484
@\libconcept{equivalence_relation}@<F&, iter_common_reference_t<I1>, iter_common_reference_t<I2>>;
@@ -2470,9 +2487,9 @@
24702487
concept @\deflibconcept{indirect_strict_weak_order}@ =
24712488
@\libconcept{indirectly_readable}@<I1> && @\libconcept{indirectly_readable}@<I2> &&
24722489
@\libconcept{copy_constructible}@<F> &&
2473-
@\libconcept{strict_weak_order}@<F&, iter_value_t<I1>&, iter_value_t<I2>&> &&
2474-
@\libconcept{strict_weak_order}@<F&, iter_value_t<I1>&, iter_reference_t<I2>> &&
2475-
@\libconcept{strict_weak_order}@<F&, iter_reference_t<I1>, iter_value_t<I2>&> &&
2490+
@\libconcept{strict_weak_order}@<F&, @\exposid{indirect-value-t}@<I1>, @\exposid{indirect-value-t}@<I2>> &&
2491+
@\libconcept{strict_weak_order}@<F&, @\exposid{indirect-value-t}@<I1>, iter_reference_t<I2>> &&
2492+
@\libconcept{strict_weak_order}@<F&, iter_reference_t<I1>, @\exposid{indirect-value-t}@<I2>> &&
24762493
@\libconcept{strict_weak_order}@<F&, iter_reference_t<I1>, iter_reference_t<I2>> &&
24772494
@\libconcept{strict_weak_order}@<F&, iter_common_reference_t<I1>, iter_common_reference_t<I2>>;
24782495
}

source/support.tex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -684,7 +684,7 @@
684684
#define @\defnlibxname{cpp_lib_polymorphic_allocator}@ 201902L // also in \libheader{memory_resource}
685685
#define @\defnlibxname{cpp_lib_print}@ 202207L // also in \libheader{print}, \libheader{ostream}
686686
#define @\defnlibxname{cpp_lib_quoted_string_io}@ 201304L // also in \libheader{iomanip}
687-
#define @\defnlibxname{cpp_lib_ranges}@ 202211L
687+
#define @\defnlibxname{cpp_lib_ranges}@ 202302L
688688
// also in \libheader{algorithm}, \libheader{functional}, \libheader{iterator}, \libheader{memory}, \libheader{ranges}
689689
#define @\defnlibxname{cpp_lib_ranges_as_const}@ 202207L // also in \libheader{ranges}
690690
#define @\defnlibxname{cpp_lib_ranges_as_rvalue}@ 202207L // also in \libheader{ranges}

0 commit comments

Comments
 (0)