2318. basic_string's wording has confusing relics from the copy-on-write era

Section: 27.4.3 [basic.string] Status: Resolved Submitter: Stephan T. Lavavej Opened: 2013-09-21 Last modified: 2018-11-25

Priority: 4

View other active issues in [basic.string].

View all other issues in [basic.string].

View all issues with Resolved status.

Discussion:

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

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

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: 27.4.3.5 [string.capacity]/8, 27.4.3.7.2 [string.append]/9, 27.4.3.7.3 [string.assign]/3 and /10, 27.4.3.7.4 [string.insert]/11, 27.4.3.7.5 [string.erase]/4, and 27.4.3.7.6 [string.replace]/11 say "replaces the string [designated/controlled] by *this". (27.4.3.7.7 [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.

Proposed resolution: