views::as_rvalue and views::common are not strictly correctSection: 25.7.7.1 [range.as.rvalue.overview], 25.7.20.1 [range.common.overview] Status: New Submitter: Hewill Kang Opened: 2024-05-10 Last modified: 2024-06-24
Priority: 4
View all other issues in [range.as.rvalue.overview].
View all issues with New status.
Discussion:
Currently, these two adaptors return views::all(E) when the type of subexpression E
models common_range or its reference is the same as the rvalue reference.
const-qualified object of a range
type must have the same non-commonality or value category of the reference as the non-const one,
this makes it theoretically possible for these two to still return non-common ranges or ranges whose reference
are lvalue when acting on a const-qualified lvalue view object, because
views::all(E) will remove the const-qualifier.
The proposed wording pedantically checks views::all_t<decltype((E))> instead of decltype((E)).
[2024-06-24; Reflector poll]
Set priority to 4 after reflector poll.
"Not aware of any use case for making const affect those properties".
Proposed resolution:
This wording is relative to N4981.
Modify 25.7.7.1 [range.as.rvalue.overview] as indicated:
-2- The name
views::as_rvaluedenotes a range adaptor object (25.7.2 [range.adaptor.object]). LetEbe an expression and letTbedecltype((E)). The expressionviews::as_rvalue(E)is expression-equivalent to:
(2.1) —
views::all(E)ifsame_as<range_rvalue_reference_t<views::all_t<T>>, range_reference_t<views::all_t<T>>>istrue.(2.2) — Otherwise,
as_rvalue_view(E).
Modify 25.7.20.1 [range.common.overview] as indicated:
-3- The name
views::commondenotes a range adaptor object (25.7.2 [range.adaptor.object]). Given a subexpressionE, the expressionviews::common(E)is expression-equivalent to:
(3.1) —
views::all(E), ifdecltype((E))views::all_t<T>modelscommon_rangeand.views::all(E)is a well-formed expression(3.2) — Otherwise,
common_view{E}.