This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of NAD status.
basic_string_view substring constructorSection: 7.3 [fund.ts.v2::string.view.cons] Status: NAD Submitter: Evan Teran Opened: 2015-10-29 Last modified: 2018-06-23
Priority: Not Prioritized
View all issues with NAD status.
Discussion:
Addresses: fund.ts.v2
string_view can be tremendously useful for dealing with sub-strings without copying. However, the
current proposal for basic_string_view,
has no constructor which provides a direct way of creating a view of a sub-string of a basic_string.
Instead, we construct a view of the whole basic_string, and then as a second step create a sub-string,
for example using substr. To simplify what I believe to be a common use case, I suggest adding an additional constructor.
template <class Allocator> basic_string_view(const basic_string<charT, traits, Allocator>& str, size_type pos, size_type count = npos);Throws:
Effects: Determines the effective lengthout_of_rangeifpos >= str.size().rlenof the string to reference as the smaller ofcountandsize() - pos. Postcondition:
data_ = str.data() + possize_ = rlen
In other words, the result is as if constructed via: basic_string_view(basic_string_view(str).substr(pos, count));
template <class Allocator>
basic_string_view(const basic_string<charT, traits, Allocator>& str, size_type pos, size_type count = npos)
: data_(nullptr), size_(0)
{
basic_string_view(str).substr(pos, count).swap(*this);
}
Note that while we have a default parameter for count, pos does not. I believe that it is best to have
this as a separate overload, as opposed to default parameters on the current constructor for two reasons:
The current constructor taking a basic_string does not throw, this overload can throw if pos >= str.size().
This constructor performs slightly more work, it is not necessary to impose this extra work on the basic case of constructing a view of a whole string.
This has been briefly discussed in the isocpp forums.
There were no obvious objections to this small improvement. Additionally, another reason to consider this addition is
to provide a more consistent interface. With raw strings, we have the ability to construct a basic_string_view
which is a sub-string. For example:
const char* s = "hello world"; auto v = string_view(s + 6);
But there is no constructor which easily does the same when starting with a basic_string.
void print_string(string_view v) {
std::cout << v << '\n';
}
int main() {
std::string s = "hello world"; // for example, we want to print the sub-string "world", without copies
// current method:
print_substring(string_view(s).substr(6));
// suggested method:
print_substring(string_view(s, 6);
}
Previous resolution [SUPERSEDED]:
This wording is relative to N4529.
Insert between 7.3 [fund.ts.v2::string.view.cons] p5 and p6 the following sequence of paragraphs:
template <class Allocator> basic_string_view(const basic_string<charT, traits, Allocator>& str, size_type pos, size_type count = npos);-?- Throws:
-?- Effects: Determines the effective lengthout_of_rangeifpos >= str.size().rlenof the string to reference as the smaller ofcountandsize() - pos. -?- Postcondition: Constructs abasic_string_view, with the postconditions in Table ?
Table ? — basic_string_view(const basic_string<charT, traits, Allocator>&, size_type, size_type)effectsElement Value data_str.data() + possize_rlen
[2016-03, Jacksonville]
Change status to "LEWG"LEWG: Do we want this constructor?
SF F N A SA 0 3 2 13 1Proposed resolution:
Not a defect. The LWG believes this missing feature is not sufficiently serious to constitute a defect.