noexcept
for std::rbegin
/rend
for arrays and
initializer_list
Section: 24.7 [iterator.range] Status: New Submitter: Jiang An Opened: 2021-03-21 Last modified: 2021-04-20
Priority: 3
View other active issues in [iterator.range].
View all other issues in [iterator.range].
View all issues with New status.
Discussion:
Overloads for std::rbegin
/rend
for built-in arrays and std::initializer_list
's has
no preconditions and never throw exceptions, thus should be noexcept
. LWG 2280
addressed a similar issue for std::begin/end
.
template<class T, size_t N> constexpr reverse_iterator<T*> rbegin(T (&array)[N]) noexcept; template<class T, size_t N> constexpr reverse_iterator<T*> rend(T (&array)[N]) noexcept; template<class E> constexpr reverse_iterator<const E*> rbegin(initializer_list<E> il) noexcept; template<class E> constexpr reverse_iterator<const E*> rend(initializer_list<E> il) noexcept;
If this change is accepted, we may also specify conditional noexcept
for std::crbegin/crend
(in 24.7 [iterator.range] p14, 15), by adding noexcept(noexcept(std::rbegin/crend(c)))
, like in
LWG 2280.
[2021-03-21; Daniel comments]
There is intentionally no P/R provided at this point, but I'm volunteering to provide it if we got feedback whether
adding conditional noexcept
specifiers similar to those provided by LWG 2280 would
be preferred or not.
[2021-04-20; Reflector poll]
Priority set to 3.
Jonathan: This would create a strange situation where std::rbegin
and std::crbegin
on an initializer_list
are noexcept but
std::begin
and std::cbegin
aren't guaranteed to be
(because an initializer_list
uses the generic std::begin
and std::cbegin
overloads, which have no conditional noexcept).
Casey: I don't think we should mark these rbegin/rend overloads noexcept
without making the pertinent reverse_iterator
constructors
conditionally noexcept.
Proposed resolution: