std::tuple_element_t<std::ranges::subrange<I, S, K>>
should remove top-level cv-qualifiersSection: 25.2 [ranges.syn] Status: New Submitter: Jiang An Opened: 2022-06-30 Last modified: 2022-07-08
Priority: 4
View other active issues in [ranges.syn].
View all other issues in [ranges.syn].
View all issues with New status.
Discussion:
std::ranges::subrange<int * volatile>>
is weird but valid. The return type (deduced type for
auto
) of std::ranges::get
for this type is int*
, because the replacing of that
(cv-unqualified) auto
drops top-level cv-qualifiers. I think get
is doing the
right thing, and std::tuple_element_t
should be consistent with the return types.
[2022-07-08; Reflector poll]
Set priority to 4 after reflector poll. "This is just contrived, especially since lots of the iterator requirements on such a type involve deprecated operations."
Proposed resolution:
This wording is relative to N4910.
Modify 25.2 [ranges.syn], header <ranges>
synopsis, as indicated:
[…] namespace std { […] template<class I, class S, ranges::subrange_kind K> struct tuple_element<0, ranges::subrange<I, S, K>> { using type = remove_cv_t<I>; }; template<class I, class S, ranges::subrange_kind K> struct tuple_element<1, ranges::subrange<I, S, K>> { using type = remove_cv_t<S>; }; template<class I, class S, ranges::subrange_kind K> struct tuple_element<0, const ranges::subrange<I, S, K>> { using type = remove_cv_t<I>; }; template<class I, class S, ranges::subrange_kind K> struct tuple_element<1, const ranges::subrange<I, S, K>> { using type = remove_cv_t<S>; }; } […]