Re: History of and support for std::basic_string::back()
On Saturday, August 3, 2013 1:24:48 PM UTC+1, Bo Persson wrote:
Jorgen Grahn skrev 2013-08-03 10:13:
[...]
An ongoing problem with std::string is that it has its own section in
the standard (Clause 21) while the "real" containers are described in an
other section (Clause 23).
This is because it was around (in working drafts) long before
anyone has even heard of the STL (which provides the "real"
containers).
In the C++98 standard Clause 21 claims that basic_string has the same
interface as a reversible container (like std::vector) but if you check
the required member functions it actually doesn't. The container types
were improved and synchronized during standardization, but basic_string
wasn't always updated. Oops!
The container types were adopted from the STL, where a certain
homogeneity of interface was a major principle. Very little was
changed in the basic container types from the STL.
The standard had a string class long before STL. After the
committee voted to adopt STL, the string class was STLified.
Very incompletely, as you observe. (I know that it was still
missing `push_back` in the CD2 for C++98, for example. That one
got caught, but a number of others didn't.)
Even today, old problems have crept back in. For example, given
a non-const string, you cannot compare two characters in it
without undefined behavior; in other words:
std::string var;
std::cin >> var;
assert( var.size() >= 2 );
if ( var[0] == var[1] )...
The `if` here has undefined behavior in C++11. It also had
undefined behavior in the CD2 preceding C++98, but this
undefined behavior was spotted and (very partially) corrected.
C++11 somehow went back to the status of pre-C++98, and restored
the undefined behavior.
--
James