C++ Tutorial · C++ Basics · Lesson 7 of 21
C++ History & Versions
How Bjarne Stroustrup turned "C with Classes" into C++, every ISO standard from C++98 to C++26 on one timeline, why C++11 is called "modern C++", and which standard to use today.
How C++ started
In 1979, Bjarne Stroustrup, a Danish computer scientist at Bell Labs, wanted a language with the
organizing power of Simula's classes and the speed and hardware access of C. He began extending C with classes, and
called the result "C with Classes". In 1983 it was renamed C++, a pun on C's ++ increment operator. The
first commercial release and Stroustrup's book The C++ Programming Language appeared in October 1985.
C++ follows a few core ideas that still guide it: zero-overhead abstractions (you don't pay for what you don't use), direct control over memory and hardware, and compatibility with C. That made it the language of operating systems, browsers, databases, game engines, trading systems and embedded devices.
Since 1998, C++ has been an ISO standard (ISO/IEC 14882). The committee, WG21, includes compiler vendors, companies and individual experts from around the world. Since C++11 it ships a new standard every three years, on a fixed schedule: whatever features are ready get in, and the rest wait for the next one.
Timeline of C++ standards
- C++29Upcoming
- In development; the committee adopted its schedule in March 2026
- C++26Upcoming
- Technically complete: approved by WG21 in March 2026, waiting for formal ISO publication
- Static reflection, contracts (
pre,post,contract_assert),std::executionfor async work,#embed, pack indexing,std::inplace_vector, a hardened standard library
- C++23Current
- The latest published standard (ISO/IEC 14882:2024)
std::expected,std::print/std::println, "deducing this",std::mdspan,std::generator,import std;
- C++20Published
- The biggest update since C++11: concepts, ranges, coroutines and modules
- The three-way comparison operator
<=>,std::format,std::span,consteval
- C++17Published
- Structured bindings
auto [key, value] = pair;,if constexpr,std::optional,std::variant,std::string_view,std::filesystem
- Structured bindings
- C++14Published
- Generic lambdas,
std::make_unique, return type deduction, binary literals0b1010
- Generic lambdas,
- C++11Published
- "Modern C++":
auto, lambdas, move semantics, smart pointers (std::unique_ptr,std::shared_ptr), range-basedfor,nullptr,constexpr, threads and a memory model
- "Modern C++":
- C++03Historic
- A bug-fix revision of C++98
- C++98Historic
- The first ISO standard, including the STL (containers, iterators and algorithms) by Alexander Stepanov
- C++ 2.0Historic
- Multiple inheritance, abstract classes; templates and exceptions followed soon after
- C++Historic
- First commercial release, with The C++ Programming Language book
- C with ClassesHistoric
- Bjarne Stroustrup starts the project at Bell Labs
How C++ modernized
- C++11 changed how C++ is written. Smart pointers and move semantics made manual
new/deleterare, andauto, lambdas and range-basedformade code shorter and safer. "Modern C++" usually means C++11 or later. - A three-year train. After the 13-year gap between C++98 and C++11, the committee switched to a fixed three-year schedule (C++14, 17, 20, 23, 26).
- Generic programming made simpler. Concepts (C++20) give readable template errors and constraints such as
template <std::integral T>. - Safer by default. Recent standards focus on safety:
std::spanandstd::expected, and in C++26 contracts, a hardened standard library and erroneous behaviour for uninitialized variables. - Compile-time programming.
constexprgrew from simple functions (C++11) to most of the language, and C++26 adds static reflection, letting programs inspect types while compiling.
Classic C++ (C++98) vs modern C++ (C++11 and later)
| Task | C++98 | Modern C++ |
|---|---|---|
| Owning a heap object | Widget* w = new Widget(); ... delete w; |
auto w = std::make_unique<Widget>(); |
| Looping over a container | for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) |
for (int x : v) |
| Type names | Spelled out in full | auto it = m.find(key); |
| Small functions | Function objects (functors) | Lambdas [](int a) { return a * 2; } |
| Null pointer | NULL or 0 |
nullptr |
| "Maybe a value" | Special values or out parameters | std::optional<int> |
| Printing | std::cout << "x = " << x << std::endl; |
std::println("x = {}", x); (C++23) |
Which standard should you use?
- New projects: C++20 is well supported by GCC, Clang and MSVC. Use C++23 if your compilers support the features you need; check the compiler support table.
- Existing projects: at least C++17. Moving up a standard rarely breaks code and gives you better tools.
- This tutorial: examples are compiled with GCC 13 using
-std=c++20when we build the lessons, and their real output is shown under each example. C++ examples can't run in your browser.
Official resources
- isocpp.org, the home of Standard C++, and the current standard
- WG21, the C++ standards committee
- cppreference.com: the community reference for every standard
- C++ Core Guidelines by Bjarne Stroustrup and Herb Sutter
- Bjarne Stroustrup's homepage, with his papers on the history of C++
Last reviewed 21 October 2026. Release and support dates come from the official release pages linked above.