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.

3589. The const lvalue reference overload of get for subrange does not constrain I to be copyable when N == 0

Section: 26.5.4 [range.subrange] Status: WP Submitter: Hewill Kang Opened: 2021-09-08 Last modified: 2021-10-14

Priority: 3

View all other issues in [range.subrange].

View all issues with WP status.

Discussion:

The const lvalue reference overload of get used for subrange only constraint that N < 2, this will cause the "discards qualifiers" error inside the function body when applying get to the lvalue subrange that stores a non-copyable iterator since its begin() is non-const qualified, we probably need to add a constraint for it.

[2021-09-20; Reflector poll]

Set priority to 3 after reflector poll.

[2021-09-20; Reflector poll]

Set status to Tentatively Ready after six votes in favour during reflector poll.

[2021-10-14 Approved at October 2021 virtual plenary. Status changed: Voting → WP.]

Proposed resolution:

This wording is relative to N4892.

  1. Modify 26.5.4 [range.subrange] as indicated:

    namespace std::ranges {
      […]
      template<size_t N, class I, class S, subrange_kind K>
        requires ((N < 2== 0 && copyable<I>) || N == 1)
        constexpr auto get(const subrange<I, S, K>& r);
    
      template<size_t N, class I, class S, subrange_kind K>
        requires (N < 2)
        constexpr auto get(subrange<I, S, K>&& r);
    }
    
  2. Modify 26.5.4.3 [range.subrange.access] as indicated:

      […]
      template<size_t N, class I, class S, subrange_kind K>
        requires ((N < 2== 0 && copyable<I>) || N == 1)
        constexpr auto get(const subrange<I, S, K>& r);
      template<size_t N, class I, class S, subrange_kind K>
        requires (N < 2)
        constexpr auto get(subrange<I, S, K>&& r);
    

    -10- Effects: Equivalent to:

    if constexpr (N == 0)
      return r.begin();
    else
      return r.end();