4053. Unary call to std::views::repeat does not decay the argument

Section: 25.6.5.2 [range.repeat.view] Status: WP Submitter: Jiang An Opened: 2024-02-05 Last modified: 2024-04-02

Priority: Not Prioritized

View all other issues in [range.repeat.view].

View all issues with WP status.

Discussion:

Currently, a binary call to std::views::repeat decay the arguments due to the deduction guide, but a unary call doesn't, which is inconsistent.

For example:

#include <concepts>
#include <ranges>

using RPV = std::ranges::repeat_view<const char*>;

static_assert(std::same_as<decltype(std::views::repeat("foo", std::unreachable_sentinel)), RPV>); // OK
static_assert(std::same_as<decltype(std::views::repeat(+"foo", std::unreachable_sentinel)), RPV>); // OK
static_assert(std::same_as<decltype(std::views::repeat("foo")), RPV>); // ill-formed
static_assert(std::same_as<decltype(std::views::repeat(+"foo")), RPV>); // OK

Presumably we should extend the deduction guide of std::ranges::repeat_view to cover the unary cases.

[2024-03-12; Reflector poll]

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

[Tokyo 2024-03-23; Status changed: Voting → WP.]

Proposed resolution:

This wording is relative to N4971.

  1. Modify 25.6.5.2 [range.repeat.view], class template repeat_view synopsis, as indicated:

    [Drafting note: The proposed wording has been suggested by Casey Carter, see microsoft/STL#3576]

    namespace std::ranges {
      […]
    
      template<class T, class Bound = unreachable_sentinel_t>
        repeat_view(T, Bound = Bound()) -> repeat_view<T, Bound>;
    }