s3rvac
s3rvac

Reputation: 10289

Why is there no support for concatenating std::string and std::string_view?

Since C++17, we have std::string_view, a light-weight view into a contiguous sequence of characters that avoids unnecessary copying of data. Instead of having a const std::string& parameter, it is now often recommended to use std::string_view.

However, one quickly finds out that switching from const std::string& to std::string_view breaks code that uses string concatenation as there is no support for concatenating std::string and std::string_view:

std::string{"abc"} + std::string_view{"def"}; // ill-formed (fails to compile)
std::string_view{"abc"} + std::string{"def"}; // ill-formed (fails to compile)

Why is there no support for concatenating std::string and std::string_view in the standard?

Upvotes: 145

Views: 25209

Answers (2)

peppe
peppe

Reputation: 22724

I've submitted P2591: Concatenation of strings and string views, linking to this SO question. The paper at this point it's targeted at C++26 minimum has been merged into C++26 (docs on cppreference).

Upvotes: 37

vitaut
vitaut

Reputation: 55534

The reason for this is given in n3512 string_ref: a non-owning reference to a string, revision 2 by Jeffrey Yasskin:

I also omitted operator+(basic_string, basic_string_ref) because LLVM returns a lightweight object from this overload and only performs the concatenation lazily. If we define this overload, we'll have a hard time introducing that lightweight concatenation later.

It has been later suggested on the std-proposals mailing list to add these operator overloads to the standard. The paper to add them, P2591 Concatenation of strings and string views, has been approved for C++26.

Upvotes: 95

Related Questions