constexpr
in std::counted_iterator
Section: 24.5.7.5 [counted.iter.nav] Status: C++23 Submitter: Jiang An Opened: 2021-11-21 Last modified: 2023-11-22
Priority: Not Prioritized
View all issues with C++23 status.
Discussion:
One overload of std::counted_operator::operator++
is not constexpr
currently,
which is seemly because of that a try-block (specified in 24.5.7.5 [counted.iter.nav]/4)
is not allowed in a constexpr function until C++20. Given a try-block is allowed in a constexpr
function in C++20, IMO this overload should also be constexpr
.
constexpr
at first.
The situation of this overload is originally found by Casey Carter, but no LWG issue has been submitted.
[2022-01-30; Reflector poll]
Set status to Tentatively Ready after nine votes in favour during reflector poll.
[2022-02-10 Approved at February 2022 virtual plenary. Status changed: Tentatively Ready → WP.]
Proposed resolution:
This wording is relative to N4901.
Modify 24.5.7.1 [counted.iterator], class template counted_iterator
synopsis, as indicated:
[…] constexpr counted_iterator& operator++(); constexpr decltype(auto) operator++(int); constexpr counted_iterator operator++(int) requires forward_iterator<I>; constexpr counted_iterator& operator--() requires bidirectional_iterator<I>; constexpr counted_iterator operator--(int) requires bidirectional_iterator<I>; […]
Modify 24.5.7.5 [counted.iter.nav] as indicated:
constexpr decltype(auto) operator++(int);-3- Preconditions:
-4- Effects: Equivalent to:length > 0
.--length; try { return current++; } catch(...) { ++length; throw; }