C++ Logo

std-proposals

Advanced search

Re: Add first and last to the std::string_view

From: Arthur O'Dwyer <arthur.j.odwyer_at_[hidden]>
Date: Fri, 22 Jan 2021 08:30:54 -0500
On Fri, Jan 22, 2021 at 6:27 AM Nicholas Schwab via Std-Proposals <
std-proposals_at_[hidden]> wrote:

> Hi,
>
> for your specific example, the in my opinion best way would be
>
> static_assert("hello world"sv.starts_with("hello"));
>
> which is possible since C++20. But in general I agree, that it would be
> nice to have these member functions. Specifically, I dislike calls to
> string_view::substr with one argument (which is equivalent to your
> proposed string_view::last):
>
> "hello_world".substr(5);
>
> This returns "_world"sv, but I do not find that obvious from the name
> only.


Absolutely. However, notice that `.substr(5)` isn't `.last(5)`; it's
`.last_all_but(5)`.
The vocabulary terms for "first" and "last" here, since Ranges-v3, are
actually "take" and "drop":
    assert("hello_world"sv.take(5) == "hello");
    assert("hello_world"sv.drop(5) == "_world");
    assert("hello_world"sv.drop_all_but(5) == "world");

The standard library was "poisoned" early on with APIs (like
single-argument .substr(5)) that take integers to indicate either "start
here" or "go until here" with no explanation. For example, it was recently
brought to my attention that

    // https://godbolt.org/z/69xY4x
    assert(std::string("hello_world", 5) == "hello");
    assert(std::string("hello_world"s, 5) == "_world");

–Arthur

Received on 2021-01-22 07:31:08