Evolution of C++ Standards
The C++ Standards Committee maintains and refines the language definition so that implementers and users share one meaning for the language.
Two Compilers and One Language
Suppose two different companies each build a compiler for the same language. Each one quietly interprets a few details differently. A program written for one compiler may then fail on the other, and programmers slowly lose confidence that the language means one thing. This is the danger of fragmentation, and it is the problem a standards committee exists to prevent.
For C++, the body that performs this job is known as the C++ Standards Committee. Its purpose is to maintain and refine the language definition so that implementers and users share one meaning for the language. Understanding how that committee worked, and how its structure changed, explains much of how C++ reached its modern form. This article follows that history as a sequence of states: what the standardization effort looked like at each stage, what changed, and what stayed the same.
Why a Language Needs a Standard
A standard is a shared definition. Without one, every compiler author is free to decide what an ambiguous or unspecified detail means, and every user inherits those decisions. The committee's work is therefore not only about adding features. It is also about keeping the definition precise enough that two independent implementations agree on the meaning of the same program.
Tracing the Committee from ANSI to WG21
The committee did not begin from nothing. AT&T Bell Labs made a decisive contribution by letting drafts of revised versions of the C++ reference manual circulate to implementers and to ordinary users. This mattered because many of those readers worked for companies that could be considered rivals of AT&T. A less cooperative owner of the language could have kept the manual private, and the resulting silence would have invited fragmentation of its own.
Roughly a hundred individuals from dozens of organizations read those drafts and commented on them. Their feedback shaped what became the generally accepted reference manual, known as the ARM, which in turn served as the base document for the ANSI standardization effort. The names of those reviewers are recorded in the published Annotated C++ Reference Manual.
Standardization then ran on two overlapping tracks. The first was the American national track. The X3J16 committee of ANSI was convened in December 1989, at the initiative of Hewlett-Packard. The second was the international track. In June 1991, the ANSI effort became part of an ISO standardization effort for C++, and the joint working group was named WG21. The labels can look confusing, so keep them separate: X3J16 is the ANSI committee, and WG21 is the ISO working group that the ANSI work was folded into. From 1990 the joint committees were the main forum for C++ evolution.
Read the timeline as a series of states. At the start, the language is defined by a manual that is shared but not yet a standard. The ANSI track gives it a national standardization home. The ISO track gives it an international home under WG21. Each state depends on the one before it: the ANSI work built on the ARM, and the ISO work built on the ANSI effort.
The Evolution Group and Major Changes
A living language needs a place where new ideas are weighed. The source describes a working group for extensions, later renamed the evolution group, that was chaired by a participant who sat on the joint committees throughout. This group was directly responsible for handling proposals for major changes to C++ and for the addition of new language features.
The division of labor matters. The joint committees were the main forum for C++ evolution, and the evolution group was the part of that forum that examined major changes and new features. Its existence means that a proposal for something new does not have to be decided ad hoc by any single compiler vendor. It enters a shared process where the whole committee can weigh it.
Predicting the 2003 Change
What do you think happens?
The 2003 release is also called C++03. Does it describe a different language from the 1998 standard, or the same language with corrections?
Reveal answer
The same language, corrected as a bug-fix edition.
The source is explicit that C++03 is essentially the same language as C++98. The 2003 release corrected errors rather than changing the language's design, so it should be read as a corrected edition of one language.
The 1998 Standard Compared with the 2003 Release
The first ISO C++ standard, identified as ISO/IEC 14882-1998, was ratified by a 22-0 national vote in 1998. A bug-fix release of that standard followed in 2003. Because of this, you will sometimes encounter the name C++03. The source is explicit that this is essentially the same language as C++98.
| Aspect | ISO/IEC 14882-1998 (C++98) | 2003 bug-fix release (C++03) |
|---|---|---|
| Role | First ratified ISO standard for C++ | Bug-fix release of that standard |
| Ratification | Ratified by a 22-0 national vote | Follows the 1998 standard |
| Design of the language | Defines the language | Corrects errors rather than changing the design |
| Name often used | C++98 | C++03 |
| Relationship | The base language | Essentially the same language as C++98 |
What differs and what stays the same between the 1998 standard and the 2003 release, as the source describes them
The source does not list each individual correction made in 2003, so the honest summary is the one the source gives: the design stayed the same and the errors were fixed. A useful habit is to treat C++98 and C++03 as two editions of one definition, not as two languages competing with each other.
Classic C and Its Two ISO Descendants
Classic C is K&R C plus enumerations and struct assignment, and it is the common baseline for later standards.
Classic C has two main descendants, ISO C and ISO C++. The source describes them as siblings rather than parent and child. Both came from the same starting point, Classic C, and both are standards in their own right. Neither is a subset that simply extends the other.
The source also mentions BCPL, defined by Richards in 1980, and C89, which the source cites as C90. These references mark the broader history behind the standards. The source does not walk through each revision in detail, so this lineage is best held at the level of Classic C followed by its two ISO branches.
Why the Siblings Drifted Apart
Imagine a team that maintains a large body of older C code and also writes new code in C++. A natural assumption is that C++ simply accepts everything C accepts, so the old code and the new code should mix freely. The source corrects this assumption. Neither ISO C nor ISO C++ is 100% compatible with Classic C, and the two standards evolved at different paces and in different directions.
The mechanism of divergence is simple to state. Two standards start from one baseline. Each then receives its own revisions, its own proposals, and its own committee decisions. Over successive revisions, the two definitions move apart. The source confirms the fact of the drift and the difference in pace and direction, but it does not provide a revision-by-revision account of where the gap grew largest.
Who Feels the Incompatibilities
The source names three groups affected by the incompatibilities between ISO C and ISO C++. The first group is people who use both C and C++. The second group is people who write in one language while using libraries implemented in the other. The third group is implementers of libraries and tools for C and C++. The source says these incompatibilities can make life miserable for all three groups.
Each group reaches the problem differently. An application developer who uses both languages meets it directly in their own code. A developer who writes in one language but relies on a library from the other meets it at the boundary, where the library's assumptions differ from their own. A library or tool implementer meets it in the design of the code they must support for both languages. The source identifies all three groups, so the incompatibility is a practical concern for the whole ecosystem, not only for compiler authors.
Mistakes About Standards and Compatibility
Common mistake Assuming C++ accepts everything C accepts
What it looks likeA team assumes its older C code can be dropped into a C++ project unchanged because C++ came from C.
Why it failsISO C and ISO C++ are siblings that share a baseline, and neither is 100% compatible with Classic C.
Do this insteadCheck the code against the C++ standard rather than trusting shared ancestry.
Common mistake Treating C++03 as a different language from C++98
What it looks likeA reader assumes the 2003 release introduced new design features that the 1998 standard lacked.
Why it failsThe source states that C++03 is essentially the same language as C++98, and the 2003 release corrected errors rather than changing the design.
Do this insteadRead C++03 as a corrected edition of one language.
Common mistake Treating X3J16 and WG21 as two unrelated committees
What it looks likeA reader assumes the ANSI committee and the ISO working group ran separate, competing efforts.
Why it failsX3J16 is the ANSI committee, and WG21 is the ISO working group that the ANSI work was folded into in June 1991.
Do this insteadThink of X3J16 as the national track that became part of the international WG21 effort.
Common mistake Believing the committee exists to add features only
Why it failsThe source states that the committee's role is to maintain and refine the definition so that implementers and users share one meaning.
Do this insteadKeep the shared meaning of the language in mind as the committee's primary purpose.
Practice: Tracing a Standard's History
A colleague says that the 2003 C++ release introduced a new language, so their old C++98 code should be rewritten for it. Using the milestones and the 1998 and 2003 comparison, explain why this claim is inaccurate and which parts of the history support your answer.
Hints
- Recall how the 2003 release is described in relation to the 1998 standard.
- Consider what the bug-fix release was meant to correct.
A library author ships a C++ library whose header works for C++ users but breaks for a team that writes in C and relies on the same header. Which of the three affected groups does this team belong to, and why does the incompatibility reach them?
Hints
- Compare the team's language with the library's language.
- Consider which group the source describes as using libraries implemented in the other language.
Summary of the Standards Story
- 1The C++ Standards Committee exists to maintain and refine the language definition so that implementers and users share one meaning.
- 2The committee moved from the ANSI committee X3J16, convened in December 1989, to the ISO working group WG21 in June 1991.
- 3The evolution group handled proposals for major changes and new language features within the joint committees.
- 4ISO/IEC 14882-1998 is the first ISO C++ standard, and the 2003 bug-fix release corrected errors in essentially the same language.
- 5ISO C and ISO C++ are sibling descendants of Classic C, neither is fully compatible with it, and the three groups affected are language users, cross-language library users, and library and tool implementers.
At a glance
- The C++ Standards Committee maintains and refines the language definition so that implementers and users share one meaning, preventing fragmentation.
- Standardization moved from the ANSI committee X3J16 (December 1989) into the ISO working group WG21 (June 1991), with the evolution group handling major changes and new features.
- ISO/IEC 14882-1998 is the first ISO C++ standard, and the 2003 bug-fix release describes essentially the same language with errors corrected.
- ISO C and ISO C++ are sibling descendants of Classic C, and neither is 100% compatible with it because the two evolved at different paces and in different directions.
- People who use both languages, people who use libraries from the other language, and people who build libraries and tools for C and C++ are all affected by the incompatibilities.