403. basic_string::swap should not throw exceptions

Section: 27.4.3.7.8 [string.swap] Status: CD1 Submitter: Beman Dawes Opened: 2003-03-25 Last modified: 2016-11-12

Priority: Not Prioritized

View all other issues in [string.swap].

View all issues with CD1 status.

Discussion:

std::basic_string, 27.4.3 [basic.string] paragraph 2 says that basic_string "conforms to the requirements of a Sequence, as specified in (23.1.1)." The sequence requirements specified in (23.1.1) to not include any prohibition on swap members throwing exceptions.

Section 23.2 [container.requirements] paragraph 10 does limit conditions under which exceptions may be thrown, but applies only to "all container types defined in this clause" and so excludes basic_string::swap because it is defined elsewhere.

Eric Niebler points out that 27.4.3 [basic.string] paragraph 5 explicitly permits basic_string::swap to invalidates iterators, which is disallowed by 23.2 [container.requirements] paragraph 10. Thus the standard would be contradictory if it were read or extended to read as having basic_string meet 23.2 [container.requirements] paragraph 10 requirements.

Yet several LWG members have expressed the belief that the original intent was that basic_string::swap should not throw exceptions as specified by 23.2 [container.requirements] paragraph 10, and that the standard is unclear on this issue. The complexity of basic_string::swap is specified as "constant time", indicating the intent was to avoid copying (which could cause a bad_alloc or other exception). An important use of swap is to ensure that exceptions are not thrown in exception-safe code.

Note: There remains long standing concern over whether or not it is possible to reasonably meet the 23.2 [container.requirements] paragraph 10 swap requirements when allocators are unequal. The specification of basic_string::swap exception requirements is in no way intended to address, prejudice, or otherwise impact that concern.

Proposed resolution:

In 27.4.3.7.8 [string.swap], add a throws clause:

Throws: Shall not throw exceptions.