From 94200042990257cd0dc76f5004182f83cf7ebf2e Mon Sep 17 00:00:00 2001
From: timsong-cpp I believe that a careful reading of the existing wording already shows that "Equivalent to:" has
no effect of the sort claimed. But since that appears to be a common misinterpretation,
this wording adds a note to put it to rest.
-The two convertible_to constraints required by ranges::fold_meow mainly
-check whether the decayed result type of the binary operator can be constructed by both the invoke type
+The two convertible_to constraints required by ranges::fold_meow mainly
+check whether the decayed result type of the binary operator can be constructed by both the invoke type
and the initial value type.
@@ -26,8 +26,8 @@ string_view init{"d"};
auto result = ranges::fold_right(vs, init, plus{}); // still ill-formed after as the constraint is not satisfied
-In addition, the two movable constraints in the function signature seem to be too strict as well since we -only need to check that the decayed result type and the initial type can be move-constructible (one for returned by +In addition, the two movable constraints in the function signature seem to be too strict as well since we +only need to check that the decayed result type and the initial type can be move-constructible (one for returned by elidable move and one for move into other overloads) instead of whether they can be move-assignable.
@@ -42,6 +42,8 @@ it would also allowvector<string>/int,
which is much less so."
+-8- Remarks: The return type is fold_left_with_iter_result<I, U> -for the first overload and fold_left_with_iter_result<borrowed_iterator_t<R>, U> +for the first overload and fold_left_with_iter_result<borrowed_iterator_t<R>, U> for the second overload.
From 32279379080ad23f2b13aefae1ee9f89767c2672 Mon Sep 17 00:00:00 2001 From: timsong-cppSix votes for Tentatively Ready, but not unanimous.
+ +move_iterator should provide iterator_category only when it models
forward_iterator
-In LWG
--2- The member typedef-name iterator_category is defined if and only if Base -models forward_range. In that case, iterator_category is defined as follows: Let C +-2- The member typedef-name iterator_category is defined if and only if Base +models forward_range. In that case, iterator_category is defined as follows: Let C denote the type iterator_traits<iterator_t<Base>>::iterator_category.
-
@@ -55,7 +55,7 @@ denote the type iterator_traits<iterator_t<Base>>::iterat(2.1) — If std::get<N>(*current_) is a
nprvalue, +- -
(2.1) — If std::get<N>(*current_) is a
nprvalue, iterator_category denotes input_iterator_tag.(2.2) — Otherwise, if C models derived_from<random_access_iterator_tag>, +
(2.2) — Otherwise, if C models derived_from<random_access_iterator_tag>, iterator_category denotes random_access_iterator_tag.
(2.3) — Otherwise, iterator_category denotes C.
2023-01-22; Jiang An comments and provides improved wording -The old proposed resolution was incorrect. I think the correct criteria could be that determined from the return type of +The old proposed resolution was incorrect. I think the correct criteria could be that determined from the return type of get-element.
@@ -69,16 +69,16 @@ This wording is relative to. --2- The member typedef-name iterator_category is defined if and only if Base -models forward_range. In that case, iterator_category is defined as follows: Let C +-2- The member typedef-name iterator_category is defined if and only if Base +models forward_range. In that case, iterator_category is defined as follows: Let C denote the type iterator_traits<iterator_t<Base>>::iterator_category.
-
@@ -89,6 +89,9 @@ is a reference type, iterator_category denotes input_iterator(2.1) — If range_reference_t<Base> is a reference type and -std::get<N>(*current_) is a
nprvalue or neither -range_reference_t<Base> nor tuple_element_t<N, range_reference_t<Base> +- -
(2.1) — If range_reference_t<Base> is a reference type and +std::get<N>(*current_) is a
nprvalue or neither +range_reference_t<Base> nor tuple_element_t<N, range_reference_t<Base> is a reference type, iterator_category denotes input_iterator_tag.(2.2) — Otherwise, if C models derived_from<random_access_iterator_tag>, +
(2.2) — Otherwise, if C models derived_from<random_access_iterator_tag>, iterator_category denotes random_access_iterator_tag.
(2.3) — Otherwise, iterator_category denotes C.
2024-07-08; Hewill Kang provides improved wording + +2026-08-28 LWG telecon; Status changed: New → Ready. +
--2- The member typedef-name
iterator_categoryis defined if and only ifBase-modelsforward_range. In that case,iterator_categoryis defined as follows: LetC+-2- The member typedef-nameiterator_categoryis defined if and only ifBase+modelsforward_range. In that case,iterator_categoryis defined as follows: LetCdenote the typeiterator_traits<iterator_t<Base>>::iterator_category.-
From b6b0cd66074d1cdb92f1221de2cdd1d2fe9cc247 Mon Sep 17 00:00:00 2001 From: timsong-cpp(2.1) — If
is_reference_v<decltype(get-element(current_))> +std::get<N>(*current_)- -
(2.1) — If
is_reference_v<decltype(get-element(current_))> isstd::get<N>(*current_)an rvaluefalse,iterator_categorydenotesinput_iterator_tag.(2.2) — Otherwise, if
Cmodelsderived_from<random_access_iterator_tag>, +(2.2) — Otherwise, if
Cmodelsderived_from<random_access_iterator_tag>,iterator_categorydenotesrandom_access_iterator_tag.(2.3) — Otherwise,
iterator_categorydenotesC.Date: Sat, 29 Aug 2026 15:31:34 -0500 Subject: [PATCH 6/6] Move 3889 to Ready --- xml/issue3889.xml | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/xml/issue3889.xml b/xml/issue3889.xml index faa43df67c..6410f8ea8d 100644 --- a/xml/issue3889.xml +++ b/xml/issue3889.xml @@ -1,7 +1,7 @@ - + std::(ranges::)destroy_at should destroy array elements in the decreasing index order Jiang An @@ -10,9 +10,9 @@-Currently, std::(ranges::)destroy_at is specified to destroy array elements in the increasing index order -(
@@ -54,12 +54,12 @@ namespace ranges {/1.1), which is inconsistent with the decreasing order specified in the core language -( /13) and the order for arrays created by std::make_shared and +Currently, std::(ranges::)destroy_at is specified to destroy array elements in the increasing index order +( /1.1), which is inconsistent with the decreasing order specified in the core language +( /13) and the order for arrays created by std::make_shared and std::allocate_shared (mandated by LWG ). 2023-02-26; Daniel comments and provides alternative wording The suggested fix indeed corrects an inconsistency, but also implies a silent behaviour change at runtime, since at least MSVC STL and -libstdc++ implement the array destruction order as specified (others not tested). +libstdc++ implement the array destruction order as specified (others not tested). The below wording therefore suggests to introduce a specific feature macro for this, so that user code can potentially react on this, -regardless of potential vendor API breakage hesitations. -The natural feature macro to increase would be that which introduced the specific array destruction behavior of destroy_at, -which was
LWG should clarify whether an entry to, and which introduced __cpp_lib_ranges, on the other hand the specification change affects -both the std::ranges and the std forms of destroy_at, so it seems plausible to suggest a new, specific feature +regardless of potential vendor API breakage hesitations. +The natural feature macro to increase would be that which introduced the specific array destruction behavior of destroy_at, +which was , and which introduced __cpp_lib_ranges, on the other hand the specification change affects +both the std::ranges and the std forms of destroy_at, so it seems plausible to suggest a new, specific feature macro for both destroy_at function templates. This is what the proposed wording does. should be added as well. @@ -70,6 +70,8 @@ LWG should clarify whether an entry to should be adde Set priority to 3 after reflector poll. + 2026-08-28 LWG telecon; Status changed: New → Ready. +The chairs will give LEWG a heads-up that we are making this change.