3643. Missing 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.

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 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>;
    […]
    
  2. Modify 24.5.7.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; }