This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of New status.

3537. §[iterator.range] Missing noexcept for std::rbegin/rend for arrays and initializer_list

Section: 23.7 [iterator.range] Status: New Submitter: Jiang An Opened: 2021-03-21 Last modified: 2021-04-24

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.

Suggestion: change these declarations in 23.7 [iterator.range] (p10, 11, 12, 13) as indicated:

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 23.7 [iterator.range] p14, 15), by adding noexcept(noexcept(std::rbegin/crend(c))), like in LWG 2280.

Conditional noexcept for other functions in 23.7 [iterator.range] (p2, 3, 7, 8, 16, 18, 20 22) may also be added for consistency.

[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: