C++ Logo

std-proposals

Advanced search

Re: [std-proposals] std::range_of concept

From: Barry Revzin <barry.revzin_at_[hidden]>
Date: Sun, 29 Sep 2024 16:00:46 -0500
On Sun, Sep 29, 2024 at 3:32 PM Arthur O'Dwyer via Std-Proposals <
std-proposals_at_[hidden]> wrote:

> On Sun, Sep 29, 2024 at 3:26 PM Avi Kivity via Std-Proposals <
> std-proposals_at_[hidden]> wrote:
>
>> I find it common to want to constrain a range to return a particular
>> type. Something like
>>
>> void f(std::ranges::range_of<unsigned> auto&& range_of_unsigned) {
>> ... }
>>
>> It would be trivial to define such a concept, or to forego the
>> abbreviated template syntax and use a requires clause, but it seems to me
>> this should be a vocabulary concept.
>> There's the question of whether the type should be same_as or
>> convertible_to, perhaps there is room for two concepts here.
>>
>
> This sounds like the same thing (in practice) as the exposition-only
> *container-compatible-range*
> <https://eel.is/c++draft/container.intro.reqmts#concept:container-compatible-range>
> .
>

The problem with range_of is what exactly that should mean. Should
range_of<unsigned> actually match any range of integral (i.e.
convertible_to) or just specifically ranges of prvalue unsigned (i.e.
same_as)? But same_as wouldn't even match vector<unsigned>, so if you want
that did you actually want same_as but matching on value_type instead? Or
decays_to?

So... sure, container-compatible-range is one of those things. But the
problem with range_of<T> is what exactly you wanted to check your T
against.


> Which has not yet been made non-exposition-only, but I suspect it's only a
> matter of time before someone brings a paper to that effect.
>
> Note that technically you cannot write your own "STL-style" container —
> one e.g. suitable as a backing store for std::stack
> <https://eel.is/c++draft/stack#cons-4.sentence-1> — without knowing about
> from_range_t and *container-compatible-range*. But the STL still gets
> away with leaving it as exposition-only because it's literally a two-liner
> and (because of how Concepts subsumption works) there's no difference
> between using the actual STL's two-liner or writing the same two-liner in
> your own namespace.
>
> –Arthur
>

What are you even talking about? from_range_t is part of the public
interface of ranges::to, and no part of it actually uses
container-compatible-range internally. Your constructor on from_range_t can
be constrained however you want.

Barry

Received on 2024-09-29 21:01:00