23.2.1 / p10 / b6:
Unless otherwise specified …
- no swap() function invalidates any references, pointers, or iterators referring to the elements of the containers being swapped.
…
Nowhere does it “specify otherwise” for vector
. So this outlaws the SBO for vector
.
string
is not bound by this rule because it does “specify otherwise” in 21.4.1/p6:
References, pointers, and iterators referring to the elements of a
basic_string sequence may be invalidated by the following uses of that
basic_string object:
- as an argument to any standard library function taking a reference to non-const basic_string as an argument.^234
234) For example, as an argument to non-member functions swap()
(21.4.8.8), operator>>() (21.4.8.9), and getline() (21.4.8.9), or as
an argument to basic_string::swap()