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

  1. C++29Upcoming
    • In development; the committee adopted its schedule in March 2026
  2. C++26Upcoming
    • Technically complete: approved by WG21 in March 2026, waiting for formal ISO publication
    • Static reflection, contracts (pre, post, contract_assert), std::execution for async work, #embed, pack indexing, std::inplace_vector, a hardened standard library
  3. C++23Current
    • The latest published standard (ISO/IEC 14882:2024)
    • std::expected, std::print / std::println, "deducing this", std::mdspan, std::generator, import std;
  4. C++20Published
    • The biggest update since C++11: concepts, ranges, coroutines and modules
    • The three-way comparison operator <=>, std::format, std::span, consteval
  5. C++17Published
    • Structured bindings auto [key, value] = pair;, if constexpr, std::optional, std::variant, std::string_view, std::filesystem
  6. C++14Published
    • Generic lambdas, std::make_unique, return type deduction, binary literals 0b1010
  7. C++11Published
    • "Modern C++": auto, lambdas, move semantics, smart pointers (std::unique_ptr, std::shared_ptr), range-based for, nullptr, constexpr, threads and a memory model
  8. C++03Historic
    • A bug-fix revision of C++98
  9. C++98Historic
    • The first ISO standard, including the STL (containers, iterators and algorithms) by Alexander Stepanov
  10. C++ 2.0Historic
    • Multiple inheritance, abstract classes; templates and exceptions followed soon after
  11. C++Historic
    • First commercial release, with The C++ Programming Language book
  12. 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/delete rare, and auto, lambdas and range-based for made 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::span and std::expected, and in C++26 contracts, a hardened standard library and erroneous behaviour for uninitialized variables.
  • Compile-time programming. constexpr grew 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++20 when we build the lessons, and their real output is shown under each example. C++ examples can't run in your browser.

Official resources

Last reviewed 21 October 2026. Release and support dates come from the official release pages linked above.