C++11 für Programmierer

Inhaltsverzeichnis
C++11 für Programmierer

C++11 für Programmierer

Rainer Grimm

Inhaltsverzeichnis

Einführung

Ziel dieses Buchs

Zielgruppe

Aufbau dieses Buchs

Didaktik

Übungsaufgaben

Exkurse

Anhang

Codebeispiele in diesem Buch

Codekonventionen

Download der Codebeispiele

Aktuelle Compiler-Unterstützung

GCC

Microsoft Visual C++

Standard

Danksagung zur 1. Auflage

Danksagung zur 2. Auflage

Errata

Kontakt

I. Tour de C++11

1. Die Standardisierung

2. Ziele von C++11

3. Kernsprache

Usability

Die Range-basierte For-Schleife

Das automatische Ableiten von Typen

Lambda-Funktionen

Vereinheitlichte Initialisierung

Entwurf von Klassen

Mächtigere Initialisierung

Explizite Klassendefinitionen

Rvalue-Referenzen

Generische Programmierung

Variadic Templates

Zusicherungen zur Compile-Zeit

Aliase Templates

Erweiterte Datenkonzepte und Literale

Konstante Ausdrücke

Plain Old Data (POD)

Unbeschränkte Unions

Streng typisierte Aufzählungstypen

Neue String-Literale

nullptr

Weitere Aufräumarbeiten und Integration von C99

Aufräumarbeiten

Integration von C99

4. Multithreading

Threads

Erzeugung von Threads

Schutz der Daten

Sichere Initialisierung der Daten

Thread-lokale Daten

Synchronisation von Threads

Asynchrone Aufgaben

5. Die Standardbibliothek

Neue Bibliotheken

Reguläre Ausdrücke

Type-Traits

Wie funktioniert Template-Metaprogrammierung?

Zufallszahlen

Zeitbibliothek

Referenz-Wrapper

Verbesserte Bibliotheken

Smart Pointer

Neue Container

Tupel

Array

Einfach verkettete Liste

Hashtabellen

Neue Algorithmen

bind und function

II. Kernsprache

6. Usability

Die Range-basierte For-Schleife

Automatische Typableitung

auto

decltype

Alternative Funktionssyntax

Lambda-Funktionen

Lambda-Funktionen als temporäre Funktionsobjekte

Bindung an den lokalen Bereich: [ ]

Argumente: ( )

Rückgabewert: →

Funktionskörper: { }

Vereinheitlichte Initialisierung

7. Entwurf von Klassen

Initialisierung von Objekten

Initialisiererlisten für Konstruktoren

Delegation von Konstruktoren

Vererbung von Konstruktoren

Direktes Initialisieren von Klassenelementen

Explizite Klassendefinitionen

default und delete

override und final

Expliziter Konvertierungsoperator

8. Rvalue-Referenzen

Lvalue- versus Rvalue-Referenzen

Move-Semantik

Perfect Forwarding

9. Generische Programmierung

Variadic Templates

Zusicherungen zur Compile-Zeit

Aliase Templates

10. Erweiterte Datenkonzepte und Literale

Konstante Ausdrücke

Plain Old Data (POD)

Unbeschränkte Unions

Streng typisierte Aufzählungstypen

Raw-String-Literale

Unicode-Unterstützung

Benutzerdefinierte Literale

nullptr

11. Removed und Deprecated

Removed

Deprecated

III. Multithreading

12. Das C++11-Speichermodell

13. Atomare Datentypen

14. Threads

Erzeugen von Threads

Lebenszeit der Daten

Operationen auf Threads

15. Gemeinsam von Threads genutzte Daten

Schutz der Daten

Mutexe

Locks

Sichere Initialisierung der Daten

Konstante Ausdrücke

call_once und once_flag

Statische Variablen in einem Blockbereich

16. Thread-lokale Daten

17. Synchronisation der Threads

18. Asynchrone Aufgaben

async

packaged_task

future und promise

IV. Die Standardbibliothek

19. Neue Bibliotheken

Reguläre Ausdrücke

Syntax der regulären Ausdrücke

Zeichen

Metazeichen

Zeichenauswahl

Zeichenklassen

Wiederholungen

Alternative

Gruppierungen

Objekte vom Typ regulärer Ausdruck

Analyse des Suchergebnisses mit match_results

Exakte Treffer mit regex_match

Suchen mit regex_search

Ersetzen mit regex_replace

Formatieren mit regex_replace und match_results.format

Wiederholtes Suchen mit regex_iterator und regex_token_iterator

regex_iterator

regex_token_iterator

Type-Traits

Typeigenschaften abfragen

Primäre Typkategorien

Zusammengesetzte Typkategorien

Typeigenschaften

Typen vergleichen

Typen transformieren

Zufallszahlen

Zufallszahlenerzeuger

random_device

Zufallszahlenverteilung

Zeitbibliothek

Zeitdauer

Zeitgeber

Zeitpunkt

Referenz-Wrapper

Die Hilfsfunktionen ref und cref

20. Verbesserte Bibliotheken

Smart Pointer

unique_ptr

shared_ptr

Löschfunktion

shared_ptr von this

Konvertierung in Ableitungshierarchien

weak_ptr

Zyklische Referenzen

Neue Container

Tupel

Hilfsfunktionen

Array

Einfach verkettete Liste

Hashtabellen

Hashfunktion

Neue Algorithmen

Praktische Helferlein

bind und function

bind

function

V. Ausblick

21. Die nächsten C++-Standards

C++14

Kernsprache

Lambda-Funktionen

Automatischer Rückgabetyp einer Funktion

Konstante Ausdrücke

Variablen-Templates

Binäre Literale

Standardbibliothek

Optionale Werte

Benutzerdefinierte Literale

dynarray

tuple

C++17

Für C++11 geplant

Module

Spezielle mathematische Funktionen

Concepts

Technical Report 2

Erweiterte Thread-Funktionalität

Netzwerkunterstützung

Signale und Slots

Dateisystem-Bibliothek

Boost.Any-Bibliothek

Bibliothek zur lexikalischen Konvertierung

Neue String-Algorithmen

VI. Anhang

A. Build-Umgebung installieren

Aktueller C++-Compiler

GNU Compiler Collection (GCC)

GCC bauen

Visual C++ 2010 Express

Boost-Bibliothek

B. Funktionsobjekte

Wie funktioniert ein Funktionsobjekt?

Welche Vorteile bietet ein Funktionsobjekt?

C. Resource Acquisition Is Initialization

D. Implizit erzeugte Methoden und Operatoren

E. Promotion Trait

F. Funktionale Programmierung

Programmieren mit mathematischen Funktionen

Charakteristiken funktionaler Programmierung

First-class functions

Funktionen höherer Ordnung

Reine Funktionen

Rekursion

Verarbeitung von Listen

Bedarfsauswertung

G. Literaturverzeichnis

H. Über den Autor

Stichwortverzeichnis

Kolophon

Einführung

2011 wurde der neue C++-Standard C++11 veröffentlicht (Stroustrup, 2011). Er ist nach einem guten Jahrzehnt die erste große C++-Neuerung, mit der C++ fit für neue Anforderungen gemacht wird. Rein quantitativ gesprochen, verdoppelt sich der C++-Standard nahezu von knapp 800 auf gut 1.300 Seiten. Da verwundert es nicht, wie Bjarne Stroustrup, der Erfinder von C++, C++11 charakterisiert:

Bjarne Stroustrup über C++11

Surprisingly, C++11 feels like a new language: The pieces just fit together better than they used to and I find a higher-level style of programming more natural than before and as efficient as ever.

(Erstaunlich, C++11 fühlt sich wie eine neue Sprache an: Die Einzelteile passen einfach besser zusammen als gewohnt, und ich finde das Programmieren auf abstrakterer Ebene natürlicher als früher und so effizient wie immer.) (Stroustrup, 2011)

Threading, funktionale Programmierung, automatisches Speichermanagement, reguläre Ausdrücke ... das alles und noch viel, viel mehr ist nun ebenfalls enthalten. Dabei hat C++11 an seine zwei Zielgruppen gedacht.

Ziel dieses Buchs

Die entscheidenden Fragen eines C++-Entwicklers, bevor er sich den Herausforderungen des neuen C++11 stellt, sind meines Erachtens:

  • Welche Erweiterungen und Neuerungen bringt C++11 mit sich?

  • Warum ist C++11 das bessere C++?

  • Wie können die neuen Features möglichst effizient eingesetzt werden?

Mit dem Beantworten dieser Fragen will das Buch überzeugen – überzeugen, dass sich der Aufwand lohnt, sich mit dem neuen C++11 auseinanderzusetzen. Denn was bleibt, ist die Fähigkeit, die anspruchsvolle Programmiersprache C++ auf einem höheren Niveau zu beherrschen.

Zielgruppe

Dieses Buch richtet sich an C++-Programmierer, die sich mit dem neuen C++11-Standard vertraut machen möchten. Zwar setzt das Buch nicht explizit C++ Kenntnisse voraus, um die Theorie und die vielen Beispiele zu verstehen, jedoch lässt sich der große Schritt von C++11 zu C++ am besten ermessen, wenn Sie C++ kennen.

Aufbau dieses Buchs

Das Buch besteht aus den folgenden vier großen Themenblöcken:

  • Tour de C++11

  • Neuerungen der Kernsprache

  • Multithreading mit C++11

  • Verbesserungen der Standardbibliothek

Einen ersten schnellen Überblick über C++11 gibt Teil I, auf rund 100 Seiten. Darin werde ich die Neuerungen von C++11 vorstellen, ohne besonders in die Tiefe zu gehen. Mit diesem Überblick besitzen Sie die notwendigen Voraussetzungen, um sich mehr mit den Details von C++11 zu beschäftigen, die in den nächsten drei Abschnitten des Buchs folgen.

Los geht es mit Teil II. Kapitel 6 geht auf die verbesserte Usability in C++11 ein: Diese besteht aus der Range-basierten For-Schleife für die einfache Ausgabe oder Modifikation von Containern, der automatischen Typableitung mit auto, aus Lambda-Funktionen und der vereinheitlichten Initialisierung in C++11. Auf die verbesserte Usability folgt der mächtigere Entwurf von Klassen in Kapitel 7. Mächtiger, da C++11 Initialisiererlisten für Konstruktoren, die Delegation und Vererbung von Konstruktoren, aber auch das direkte Initialisieren von Klassenelementen anbietet. Mächtiger, da C++11 explizite Klassendefinitionen mit den Schlüsselwörtern default und delete, override und final, aber auch explizite Konvertierungsoperatoren unterstützt. In Kapitel 8 folgt das auf Performance optimierte Arbeiten mit Containern in Form von Move-Semantik und Perfect Forwarding. Deutlich mächtiger wird in C++11 auch die generische Programmierung, die in Kapitel 9 beschrieben wird. Sie werden Variadic Templates, also Templates mit beliebig vielen Argumenten, Zusicherungen zur Compile-Zeit an den Code und Aliase Templates kennenlernen. Abgeschlossen wird dieser Teil des Buchs zur Kernsprache von C++11 mit den erweiterten Datenkonzepten und Literalen. In Kapitel 10 stelle ich konstante Ausdrücke, die zur Compile-Zeit ausgewertet werden können, unbeschränkte Unions und streng typisierte Aufzählungstypen vor. Weiter geht es mit Raw-String-Literalen, benutzerdefinierten Literalen und der Unicode-Unterstützung in C++11.

Teil III ist der nächste Themenblock des Buchs, der sich den Details widmet. Behandelt werden in den Kapitel 12 bis 18 die atomaren Datentypen von C++11, die Erzeugung und Verwaltung von Threads sowie den Schutz von gemeinsam genutzten Daten durch Mutexe und Locks. Weiter geht es mit Bedingungsvariablen und Thread-lokalem Speicher. Den Abschluss bilden asynchrone Operationen. Mit ihnen lassen sich Tasks für den einfachen Umgang mit Threads definieren.

Bezogen sich die vorherigen Themenblöcke vorwiegend auf den C++11-Kern, so in Teil IV des Buchs die Standardbibliothek unser zentrales Thema. Im Besonderen werden Sie in Kapitel 19 die vielen neuen und verbesserten Bibliotheken kennenlernen. Detailliert vorstellen werde ich Ihnen in Theorie und Praxis die neuen Bibliotheken für das Arbeiten mit regulären Ausdrücken, für die Typintrospektion und -manipulation mit den Type-Traits, für das Erzeugen von Zufallszahlen und für den Umgang mit der neuen Zeitfunktionalität. Den Abschluss dieses Teils bilden die verbesserten Bibliotheken zu den Smart Pointern, zu den neuen Containern wie Arrays, Tupels und Hashtabellen und zu den neuen Algorithmen in Kapitel 20.

Was wäre ein C++11-Buch ohne Ausblick auf die weitere Entwicklung von C++? Genau diese Vorschau will Teil V, geben. Darin erfahren Sie einerseits, warum die wohl wichtigste Neuerung von C++11 – Concepts, ein Typsystem für Templates – aus dem C++11-Standard gestrichen wurde, und andererseits, welche Ziele die nächsten Standards C++14 und C++14 C++1y verfolgen.

Praxistipp

Wie das Buch zu lesen ist

Den ersten Überblick gibt Teil I. Auf rund 100 Seiten werden die neuen Features von C++11 vorgestellt, ohne allzu sehr in die Tiefe zu gehen. Ist das große Bild gezeichnet, ist es Zeit, sich in die einzelnen Komponenten genauer anzusehen und die Tastatur zu nutzen. Die drei weiteren Teile zu den Neuerungen der Kernsprache, zur neuen Threading-Mächtigkeit und zu Verbesserungen der Standardbibliothek bilden den Kern dieses Buchs.

Didaktik

Auf die Suche in der Breite folgt die in der Tiefe. Diesem einfachen Muster aus der Graphentheorie werde ich folgen. Zuerst werde ich die neuen Features vorstellen und dann genauer auf die Details eingehen, um schließlich anhand des einen oder anderen Beispiels sowie im Besonderen mit Übungsaufgaben weiter in die Tiefen vorzustoßen.

Diese Strategie, sich der unbekannten Materie von verschiedenen Seiten und mit immer detaillierterem Anspruch zu nähern, halte ich für einen idealen Ansatz, das Neue zum Vertrauten zu machen. Die größte Gefahr dabei besteht darin, die Redundanz zu übertreiben. Ich hoffe, es ist mir gelungen, diese in Grenzen zu halten.

Übungsaufgaben

Um den größtmöglichen Nutzen aus den Übungsaufgaben zu ziehen, stehen die Musterlösungen der Übungsaufgaben unter Aufgaben zur Verfügung (Download unter http://examples.oreilly.de/german_examples/cplusplusleitfadenger/). Denn nichts hat mich in meinem Mathematikstudium mehr gestört als eine Übungsaufgabe, die nicht lösbar war.

Exkurse

Die vielen Exkurse sind zum Schmökern da. Sie sollen Hintergrundinformationen liefern, ohne den roten Faden des Buchs zu stören. Es schadet daher auch nicht, sie beim ersten Lesen des Werks zu ignorieren.

Anhang

Im Anhang finden Sie weiterführende Informationen, die das Buch abrunden sollen.

Zum einen enthält er die Anleitung dazu, wie Sie einen aktuellen C++-Compiler und die Boost-Bibliothek installieren können. Beides sind notwendige Voraussetzungen, um alle Beispielprogramme in Aktion zu sehen.

Zum anderen finden Sie Hintergrundinformationen zu C++11, die zu umfangreich für einen Exkurs sind. Dies betrifft Themen wie Funktionsobjekte in C++, das bekannte C++-Idiom Anhang C, Promotion Traits, implizit erzeugte Methoden und Operatoren sowie insbesondere die funktionale Programmierung.

Codebeispiele in diesem Buch

Der größte Nutzen lässt sich aus einem Buch zur Programmierung ziehen, wenn die neuen Features in der Anwendung dargestellt werden. Daher werde ich viele Codeschnipsel und lauffähige Programme in dem Werk verwenden und deren Ausgabe präsentieren. Noch mehr Nutzen besitzt das Buch, wenn Sie mit den Codebeispielen arbeiten, sie modifizieren und erweitern. Zur weiteren Vertiefung der neuen Funktionalität schließe ich die Kapitel mit Übungsaufgaben ab, die sich mit den neuen C++11-Features in der Regel komfortabel lösen lassen.

Codekonventionen

Entgegen meiner Gewohnheit werde ich die Codeblöcke nur um zwei Leerzeichen einrücken, um Platz zu sparen. Namensraumbezeichner wie std werde ich, wenn möglich, im Quellcode verwenden. Damit ist eindeutig, zu welchem Namensraum eine Funktion oder Klasse gehört. Zur besseren Orientierung im Quellcode werde ich diesen nummeriert darstellen.

Download der Codebeispiele

Alle Programme sowie die Musterlösungen der Übungsaufgaben des Buchs stehen hier zur Verfügung:

http://examples.oreilly.de/german_examples/cplusplusleitfadenger/

Das trifft auch auf die Programme zu, die mit dem aktuellen GCC 4.7 noch nicht lauffähig sind. Trotz großer Sorgfalt kann es insbesondere bei diesen Programmen vorkommen, dass sich noch der eine oder andere Bug darin eingenistet hat.

Im Anhang gehe ich darauf ein, wie Sie eine aktuelle Build-Umgebung für Windows oder Linux erhalten.

Aktuelle Compiler-Unterstützung

Einen aktuellen C++-Compiler (C++11 Compilers Support, 2013) vorausgesetzt, können Sie sofort loslegen, denn viele Features des neuen Standards stehen schon zur Verfügung.

Das trifft vor allem auf den GCC 4.7-C++-Compiler (C++11 Support in GCC 4.7, 2012) zu, deckt dieser doch nahezu den ganzen C++11-Standard ab. Um möglichst viele neue Features in Aktion zu sehen, werde ich daher auf den GCC 4.7 zurückgreifen. Diverse Beispiele, insbesondere Übungsaufgaben, habe ich mit dem aktuellen C++-Compiler von Microsoft, VC10, entwickelt. Vereinzelt kam auch der Clang-Compiler clang++ 3.1 zum Einsatz (Clang 3.1 Release Notes, 2013).

Aktuelle Compiler-Unterstützung für C++11
Abbildung 1 Aktuelle Compiler-Unterstützung für C++11

GCC

Wird bei aktuellen GCC-Compilern das Flag std=c++0x (ab GCC 4.3) bzw. das Flag std=c++11 (ab GCC 4.7) angegeben, verwendet dieser neben der neuen Kernfunktionalität auch die neuen Bibliotheken. Lediglich für die Regulär-Expression- und die Threading-Bibliothek ist noch Bastelarbeit notwendig. Hierzu müssen Sie die Header-Dateien und Bibliotheken aus Boost (Boost.TR1) verwenden. Das ist aber durchaus legitim, dienen diese doch als Grundlage für die aktuelle C++-Bibliothekserweiterung TR1.

Fehlt die Ausgabe eines Listings, liegt das daran, dass der aktuelle GCC 4.7 dieses Feature noch nicht unterstützt. Schwarz auf weiß sehen Sie die detaillierte Übersicht zu den aktuellen GCCs in Abbildung 2 und Abbildung 3.

Aktuelle GCC-Unterstützung (Teil 1)
Abbildung 2 Aktuelle GCC-Unterstützung (Teil 1)
Aktuelle GCC-Unterstützung (Teil 2)
Abbildung 3 Aktuelle GCC-Unterstützung (Teil 2)

Copyright © Free Software Foundation, Inc. Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

Microsoft Visual C++

Neben dem aktuellen GCC ist auch das aktuelle Visual C++ 10.0 sehr weit in der Unterstützung des modernen C++11. Tabelle 1 (Lavavej, 2010) von Stephan T. Lavavej, die der Struktur der Abbildung 2 folgt, gibt einen genauen Überblick über Visual C++ 9.0 und Visual C++ 10.0.

Tabelle 1 C++0x Core Language Features in VC9 und VC10

C++0x Core Language Features

VC9

VC10

Rvalue references

No

v2

 

Rvalue references v2

No

v2

 

Rvalue references for *this

No

v2

 

Initialization of class objects by rvalues

Yes

Yes

static_assert

No

Yes

auto

No

Yes

 

Multi-declarator auto

No

Yes

 

Removing old auto

No

Yes

 

Trailing return types

No

Yes

Lambdas

No

v1.0

decltype

No

Yes

Right angle brackets

Yes

Yes

Extern templates

Yes

Yes

nullptr

No

Yes

Strongly typed enums

Partial

Partial

Forward declared enums

No

No

Extended friend declarations

Partial

Partial

Local and unnamed types as template arguments

Yes

Yes

C++0x Core Language Features: Concurrency

  

exception_ptr

No

Yes

Thread-local storage

Partial

Partial

C++0x Core Language Featues: C99

  

__func__

Partial

Partial

C99 preprocessor

Partial

Partial

long long

Yes

Yes

Zwei kleine Anmerkungen noch zu der Tabelle: Rvalue-Referenzen Version 2 (v2) beschreibt die Implementierung, die im kommenden C++11 Standard sein wird. Diese Version 2 bildet auch die Grundlage dieses Buchs. Lambda-Funktionen in VC10 weichen nur in Feinheiten (subleties) (Lavavej, 2010) von den C++11-Lambda-Funktionen ab.

Standard

Bei meiner Vorstellung des neuen C++11-Standards habe ich mich auf den neuen Standard »ISO International Standard ISO/IEC 14882:2011(E) Programming Language« C++ bezogen. Dieser wurde formal im August 2011 als neuer Standard zugelassen.

Danksagung zur 1. Auflage

Im Jahr 2009 hielt ich einige Vorträge über C++0x bei meinem Arbeitgeber science + computing ag (science + computing ag, 2011). Für die reichlich konstruktive Kritik danke ich Mathias Fröhlich, Peter Hrenka, Götz Isenmann, Marc Lohrer, Ove Sommer, Daniel Trstenjak, Milosz Walter und den weiteren Teilnehmern der internen Fortbildungsrunde.

Mein Dank gilt Mathias Huber vom Linux Magazin (Linux Magazin), der mich bei meinen zwei Artikeln zu C++0x (Grimm, Erfrischend neu, 2010) und (Grimm, Reichhaltiges Angebot, 2010) redaktionell begleitete.

Danken möchte ich Johannes Schaub und Stefan Reuther, die mir einige Erläuterungen zum neuen C++11-Standard gegeben haben. Mein besonderer Dank gilt Daniel Krügler, Moderator der Newsgruppe de.comp.lang.iso-c++ (de.comp.lang.iso-c++, 2011), der mir zu einem tieferen Einblick in die C++11-Materie verhalf.

Ich danke meiner Lektorin Brigitte Bauer-Schiewek vom Addison-Wesley Verlag, bei dem die 1. Auflage dieses Buchs erschienen ist, sowie meinem Fachlektor Dirk Frischalowski und meiner Sprachlektorin Petra Kienle, die mich bei dem neuen Abenteuer, ein Buch zu schreiben, begleitet haben.

Mein größter Dank gilt natürlich meiner Frau Beatrix und unseren zwei Kindern Juliette und Marius, die mich dabei unterstützten, meinen ganzen Tagesablauf dem Buchprojekt C++11 unterzuordnen.

Danksagung zur 2. Auflage

Viel konstruktive Kritik zu der ersten Auflage dieses Buch habe ich durch die C++-Community erfahren. Vielen Dank insbesondere an Haluk Erce Rodopman, Luc Deknock, Titus von Boxberg, Norbert Eichenseher und Stephan Leibbrandt.

Ich danke der Lektoratsleiterin Ariane Hesse und der Lektorin Alexandra Follenius. Dank ihnen hat mein Buch beim O’Reilly Verlag eine neue und dauerhafte Heimat gefunden.

Errata

Auf meiner Homepage www.grimm-jaud.de finden Sie eine detaillierte Liste meiner Errata. Denn wenn mich die erste Auflage des Buchs etwas gelehrt hat, dann die Einsicht, dass diese Seite leider notwendig ist.

Kontakt

Für Anregungen, Verbesserungen, Kritiken, positiv wie negativ, können Sie mich direkt unter meiner E-Mail-Adresse erreichen:

Teil I. Tour de C++11

Kapitel 1. Die Standardisierung

Ein neuer C++-Standard ist kein alltägliches Ereignis für die C++-Programmiersprache, muss sie doch einen langwierigen Prozess durchlaufen, der in einem neuen ISO-Standard endet. Genau dieser Prozess fand mit C++11 im Jahr 2011 seinen Abschluss. Die einfache Zeitachse in Abbildung 1.1 hilft, den Überblick über die Standardisierung von C++ zu behalten.

Zeitachse C++
Abbildung 1.1 Zeitachse C++

ARM C++

Ende der 80er-Jahre gab es mehrere unabhängige C++-Implementierungen. Daher legte Bjarne Stroustrup 1989 in seinem Buch »The Annotated C++ Reference Manual« (ARM C++) den Funktionsumfang von C++ fest. Dieser erste C++-Standard umfasste insbesondere die zwei wichtigen Features Templates und Ausnahmebehandlungen.

C++98

C++03

Darüber hinaus erfüllte ARM C++ noch eine zweite wichtige Aufgabe. Er bildete die Grundlage für den ISO-C++-Standard ISO/IEC 14882:1998 (C++98). Die Initiative, C++ zu standardisieren, wurde von Hewlett-Packard zusammen mit AT&T, DEC und IBM aufgegriffen. C++98 ist der bis 2011 gültige C++-Standard, sieht man einmal von seiner kleinen technischen Korrektur 2003 (C++03), formal ISO/IEC 14882:2003, ab.

C99

Der aktuell gültige C-Standard, formal ISO/IEC 9899:1999 (C99), erschien nach dem C++-Standard C++98. Dies hat zur Folge, dass der neue C++-Standard C++11 teilweise um die Features von C99 erweitert wurde.

TR1

Der C++ Technical Report 1 (TR1) war der erste große Schritt hin zum neuen Standard C++11. Die C++-Bibliothekserweiterung ISO/IEC TR 19768 wurde 2005 verabschiedet. TR1 ist zwar kein offizieller Standard, beschreibt aber viele Komponenten, die in den offiziellen Standard C++11 aufgenommen wurden. Die neuen Bibliotheken zu regulären Ausdrücken, Smart Pointern, Hashtabellen oder Zufallszahlengeneratoren basieren alle auf TR1 und somit auf den entsprechenden Boost-Bibliotheken. Das Boost-Projekt (boost, 2011), das von Mitgliedern des C++-Standardisierungskomitees gegründet wurde, ist die eigentliche Ideenwerkstatt für die aktuellen Erweiterungen der C++-Bibliothek.

C++11

Zum jetzigen Zeitpunkt – Ende 2013 – hat sich bereits abgezeichnet, welcher Name sich für den neuen C++-Standard durchsetzen wird. Der inoffizielle Name C++0x, der sich in den letzten Jahren etabliert hat, muss dem offiziellen Namen C++11 weichen, der den neuen Namen des ISO-C++-Standards beschreibt.

C++14

Nur drei Jahre nach dem aktuellen Standard C++11 ist mit C++14 ein neuer Standard geplant. Dieser steht in der Tradition von C++03, denn auch die Aufgabe von C++14 besteht darin, Bugs im aktuellen Standard zu beseitigen und C++ intuitiver werden zu lassen.

C++17

Weitere drei Jahre später ist mit C++17 der nächste richtige C++-Standard geplant. Mit ihm soll C++ ein Typsystem für Templates, eine deutlich erweiterte Thread-Funktionalität, Module und viele neue Bibliotheken, beispielsweise zur Netzwerkprogrammierung oder auch zur String-Manipulation, erhalten. Einen tieferen Blick in die Glaskugel wage ich in Kapitel 21.

Demokratischer Prozess

Hinter den neuen Standards C++11 und auch C++98 stehen viel Zeit und eine immenser Aufwand, weil sie nicht auf einer zentralen Autorität wie Sun/Oracle bei Java oder Guido van Rossum, dem wohlwollenden Diktator auf Lebenszeit bei Python, basieren, sondern aus einem demokratischen Prozess hervorgehen. Bjarne Stroustrup beschreibt in seiner Vorstellung bei Google den Prozess als »[...] formal, slow, bureaucratic, and democratic [...]« und fügt noch hinzu: »The worst way, except for all the rest« (Stroustrup, 2007).

Das ISO-Standardisierungskomitee

Das ISO-Standardisierungskomitee besteht aus 160 Mitgliedern, von denen sich ca. 60 Mitglieder dreimal jährlich weltweit zusammenfinden. Diese Teilnehmer kommen aus mehreren Nationen und Organisationen. Jede Organisation besitzt maximal eine Stimme. Die hauptsächliche Arbeit geschieht in vier Gruppen zur Kernsprache und zur Bibliothek und in gut zehn weiteren Untergruppen zu C++. Diese Untergruppen beschäftigen sich mit Themen wie Modulen, Multithreading, dem Dateisystem oder dem Netzwerk in C++. Genaueres lässt sich auf der Homepage des C++-Standardkomitees (C++ Standard Komitee, 2013) nachlesen.

Kapitel 2. Ziele von C++11

C++11 hat viel zu bieten:

Von C über C++ nach C++11
Abbildung 2.1 Von C über C++ nach C++11

Dabei baut die Multiparadigmen-Programmiersprache C++11 auf den Prinzipien von C++ auf.