Created on 2026-05-11.00:00:00 last changed yesterday
Proposed resolution:
This wording is relative to N5046.
Modify [view.interface], class template `view_interface` synopsis, as indicated:
namespace std::ranges {
template<class D>
requires is_class_v<D> && same_as<D, remove_cv_t<D>>
class view_interface {
[…]
public:
[…]
template<random_access_range R = D>
constexpr decltype(auto) operator[](range_difference_t<R> n) {
return ranges::begin(derived())[n];
};
template<random_access_range R = const D>
constexpr decltype(auto) operator[](range_difference_t<R> n) const {
return ranges::begin(derived())[n];
};
};
}
Modify [view.interface.members] as indicated:
constexpr decltype(auto) back() requires bidirectional_range<D> && common_range<D>; constexpr decltype(auto) back() const requires bidirectional_range<const D> && common_range<const D>;-3- Hardened preconditions: `!empty()` is `true`.
-4- Effects: Equivalent to:return *ranges::prev(ranges::end(derived()));template<random_access_range R = D> constexpr decltype(auto) operator[](range_difference_t<R> n); template<random_access_range R = const D> constexpr decltype(auto) operator[](range_difference_t<R> n) const;-?- Hardened preconditions: If `D` models `sized_range`, then
-?- Effects: Equivalent to:n >= 0 && n < ranges::distance(derived())is `true`.return ranges::begin(derived())[n];
Hardening `view_interface::operator[]` to prevent out-of-bounds access is worthwhile for the `sized_range` cases, and we have already done so for other standard views such as `span` and `string_view`'s `operator[]`.
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2026-05-16 12:27:04 | admin | set | messages: + msg16295 |
| 2026-05-11 00:00:00 | admin | create | |