string_view
was a proposed feature within the C++ Library Fundamentals TS(N3921) added to C++17
As far as i understand it is a type that represent some kind of string "concept" that is a view of any type of container that could store something viewable as a string.
- Is this right ?
- Should the canonical
const std::string&
parameter type becomestring_view
? - Is there another important point about
string_view
to take into consideration ?
The purpose of any and all kinds of "string reference" and "array reference" proposals is to avoid copying data which is already owned somewhere else and of which only a non-mutating view is required. The
string_view
in question is one such proposal; there were earlier ones calledstring_ref
andarray_ref
, too.The idea is always to store a pair of pointer-to-first-element and size of some existing data array or string.
Such a view-handle class could be passed around cheaply by value and would offer cheap substringing operations (which can be implemented as simple pointer increments and size adjustments).
Many uses of strings don't require actual owning of the strings, and the string in question will often already be owned by someone else. So there is a genuine potential for increasing the efficiency by avoiding unneeded copies (think of all the allocations and exceptions you can save).
The original C strings were suffering from the problem that the null terminator was part of the string APIs, and so you couldn't easily create substrings without mutating the underlying string (a la
strtok
). In C++, this is easily solved by storing the length separately and wrapping the pointer and the size into one class.The one major obstacle and divergence from the C++ standard library philosophy that I can think of is that such "referential view" classes have completely different ownership semantics from the rest of the standard library. Basically, everything else in the standard library is unconditionally safe and correct (if it compiles, it's correct). With reference classes like this, that's no longer true. The correctness of your program depends on the ambient code that uses these classes. So that's harder to check and to teach.
Note that if C++17's
std::string_view
is created from/for astd::string
, then as soon as saidstd::string
gets out-of-scope the saidstd::string_view
's behavior will be undefined.Also, the
Qt
framework renamedQStringRef
toQStringView
, but both said Qt classes have similar out-of-scope behavior asstd::string_view
, just instead "undefined" it's a dangling-QString-pointer.