Title
basic_string's wording has confusing relics from the copy-on-write era
Status
resolved
Section
[basic.string]
Submitter
Stephan T. Lavavej

Created on 2013-09-21.00:00:00 last changed 65 months ago

Messages

Date: 2018-11-25.18:34:32

[string.capacity]/8 specifies basic_string::resize(n, c) with:

Effects: Alters the length of the string designated by *this as follows:

  • If n <= size(), the function replaces the string designated by *this with a string of length n whose elements are a copy of the initial elements of the original string designated by *this.

  • If n > size(), the function replaces the string designated by *this with a string of length n whose first size() elements are a copy of the original string designated by *this, and whose remaining elements are all initialized to c.

This wording is a relic of the copy-on-write era. In addition to being extremely confusing, it has undesirable implications. Saying "replaces the string designated by *this with a string of length n whose elements are a copy" suggests that the trimming case can reallocate. Reallocation during trimming should be forbidden, like vector.

At least 7 paragraphs are affected: [string.capacity]/8, [string.append]/9, [string.assign]/3 and /10, [string.insert]/11, [string.erase]/4, and [string.replace]/11 say "replaces the string [designated/controlled] by *this". ([string.copy]/3 is different — it "replaces the string designated by s".)

Of the affected paragraphs, resize() and erase() are the most important to fix because they should forbid reallocation during trimming.

Resolved by the adoption of P1148 in San Diego.

History
Date User Action Args
2018-11-25 18:34:32adminsetstatus: new -> resolved
2013-09-21 00:00:00admincreate