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

### 3643. Missing `constexpr` in `std::counted_iterator`

Section: 23.5.6.5 [counted.iter.nav] Status: WP Submitter: Jiang An Opened: 2021-11-21 Last modified: 2022-02-10

Priority: Not Prioritized

View all issues with WP status.

Discussion:

One overload of `std::counted_operator::operator++` is not `constexpr` currently, which is seemly because of that a try-block (specified in 23.5.6.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`.

MSVC STL has already added `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.

1. Modify 23.5.6.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>;
   >     […]

2. Modify 23.5.6.5 [counted.iter.nav] as indicated:

   >     constexpr decltype(auto) operator++(int);

   > > -3- Preconditions: `length > 0`.

   > > -4- Effects: Equivalent to:

   > > >     --length;
   > > >     try { return current++; }
   > > >     catch(...) { ++length; throw; }