This is errata for the first printing. All but corrections marked with * are fixed for the current (3rd) printing.
You find the printing number as the first number on the last line of the copyright page.
I only list things that can affect understanding. Spelling mistakes you can fix yourself if you spot them.
I very much appreciate reports of errors and constructive comments on the contents in general.
For brevity, I use the old replacement syntax: s/old/new/
- Bjarne
pg64 s/Stratchey/Strachey/
pg67 s/McClusky/McCluskey/
pg78 at the end of sec3.5.3 add
See sec17.5.2 for a way to explicitly request overloading of base and derived class functions.
pg99 replace the last paragraph of 3.11.5.1 with
This rule was the subject of much discussion and was eventually revised to match the rule for declarations in conditions (sec3.11.5.2). That is, a name introduced in a for-statement initializer goes out of scope at the end of the for-statement.
pg165 s/Sing/Singh/
pg190 s/Erathostenes/Eratosthenes/
pg228 s/and surprising/and less surprising/
pg 255 change the definitions of true and TRUE to
const true = 1; #define TRUE 1pg343 add after sec15.3.1
Class templates as template arguments were approved at the March 1994 meeting in San Diego.
pg 349 s/lookup s/compare(s1,s2,NOCASE)/compare pg362 replace the last sentense of 15.9.1 by
Member templates are described in sec15.9.3.
pg364 first line s/aren't allowed/weren't allowed/
third line from bottom: s/I hope to see member templates in C++.//
pg375 write should be defined like this: pg426 s/syntactically correct/syntactically correct and type check/
pg80 at the end of 3.6.1 add
Naturally, I realized that not all constructors defined meaningful and
unsurprising implicit conversions. For example, a vector type usually has a
constructor taking an integer argument indicating the number of elements. It was
an unfortunate sideefect to have v=7 construct a vector of seven elements and
assign it to v . I didn't consider this problem urgent, though. Several members
of the C++ standards committee (sec6.2), notably Nathan Myers, suggested that a
solution was necessary. In 1995, the problem was solved by allowing the prefix
explicit to be added to the declaration of a constructor. A constructor declared
explicit is used for explicit construction only and not for implicit
conversions. For example, declaring vector's constructor ``explicit
vector(int);'' makes v=7 an error while the more explicit v=vector(7) as ever
constructs and assigns a vector.
pg129 add footnote
In July 1994, the committee voted for ``CD registration'' as the first step
of the completion of the ISO process is now called. Scheduling a standard isn't
easy. In particular, ``details'' such as what a standard is and how you must
make one aren't standardized and seem to change every year.
pg131 add and modify list entries
So how is the committee doing? We won't really know until the standard
appears because there is no way of knowing how new proposals will fare. This
summary is based on the state of affairs after the November 1994 meeting in
Valley Forge.
Proposing extensions for C++ seems to be popular. For example:
To contrast, the committee has rejected many proposals. For example:
pg157 s/color(green)/Color(green)/
pg194 add footnote
Here, I have the great pleasure of eating my words! The committee did raise
to the occasion and approved a splendid library of containers, iterators, and
fundamental algorithms designed by Alex Stepanov. This library, often called the
STL, is an elegant, efficient, formally sound, and well-tested framework for
containers and their use (Alexander Stepanov and Meng Lee: The Standard Template
Library, HP Labs Technical Report HPL-94-34 (R. 1), August, 1994. Mike Vilot: An
Introduction to the STL Library. The C++ Report, October 94). Naturally, the STL
includes map and list classes, and subsumes the dynarray, bits, and bitstring
classes mentioned above. In addition, the committee approved vector classes to
support numeric/scientific computation based on a proposal from Ken Budge from
Sandia Labs.
pg239 s/struct {/struct Y {/
pg241 s/someone sitting on my right/Jim Howard/ delete sentence beginning
/Unfortunately, I have forgotten/
pg244 the last code fragment should be pg246 in example 1,2,3, and 5 swap X and X& in the return types. in
example 4 swap postfix and prefix in the comments.
pg263 s/D { g }/D { g() }/
pg265 s/f(2)/f(2);/
pg274 s/int go_draw/void go_draw/
pg278 end of paragraph near middle of page:
s/this simple notion/this simple notion directly/
pg283 declare members of B and C public.
pg304 s/S::f/S::mf/
s/p->*pf/p->*pmf/
*pg322 s/}/return p; }/
s/the usual way except/the usual way by/
pg332 Replace sentense near the middle by
pd2 will point to the start of the D object passed, whereas pd1 will point to
the start of D 's B sub-object.
pg333 replace example by pg359 s/lt()/lt(char a, char b)/
*pg374 replace the definition Comparable by: pg396 add to just beforethe start of sec16.9.1
In 1995, we found a scheme that allows some static checking of exception
specifications and improved code generation without causing the problems
described above. Consequently, exception specifications are now checked so that
pointer to function assignments, initializations, and virtual function
overriding cannot lead to violations. Some unexpected exceptions can still
occur, and those are caught at run time as ever.
D&E was awarded one of ``Software Development'' Magazine's Productivity
awards.
You can find reviews in Dr. Dobbs Journal, August 1994 (by Al Stevens) and
The C++ Report, October 1994 (by Keith Gorlen) for(int i=0; i< str1.length() && i< str2.length(); i++)
if (!C::eq(str1[i],str2[i]))
return C::lt(str1[i],str2[i]);
return str2.length()-str1.length();
pg360
s/compare(swede1,swede2,LITERATE)/compare void write(int vv) { v=vv; }
pg389 in comment s/close/open/
Errata to the second printing:
pg5 change 1994 Sep Draft ANSI/ISO standard due
to
1994 Aug ANSI/ISO Committee Draft registered
pg6 move CLOS to 1988
pg150-152
replace sec6.4.2 with
There is some hope of restraint and that accepted
features will be properly integrated into the language. Only a few new features
have been accepted so far:
Exceptions
and templates stand out among the extensions as being mandated by the original
proposal and described in the ARM, and also by being a couple of orders of
magnitudes more difficult to define and to implement than any of the other
proposals.
Please note that a rejection doesn't imply that the proposal was
deemed bad or even useless. In fact, most proposals that reach the committee are
technically sound and would help at least some subset of the C++ user community.
The reason is that most ideas never make it through the initial scrutiny and
effort to make it into a proposal.
void h(RefNum r, Num& x)
{
r.bind(x); // error: no Num::bind
(&r)->bind(x); // ok: call RefNum::bind
}
pg245 s/RefX/RefNum/
const char cc = 'a';
const char* pcc = &cc;
const char** ppcc = &pcc;
void* pv = ppcc; // no cast needed:
// ppcc isn't a const, it only points to one,
// but const vanished!
char** ppc = (char**)pv; // points to pcc
void f()
{
**ppc = 'x'; // Zap!
}
pg352 s/(B template
pg389 at the end of the declaration of FilePtr: s/}/};/
Comments: