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
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.
Für den Einsteiger: einfacher zu lernen durch die vereinheitlichte Syntax und die mächtigen Bibliotheken, mit denen Standardaufgaben leichter erledigt werden können.
Für den Profi: eine bessere Programmiersprache für die Systemprogrammierung und das Schreiben von Bibliotheken durch neue und verbesserte Features der Kernsprache und der Bibliotheken.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.
Copyright © Free Software Foundation, Inc. Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.
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.
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.
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.
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.
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.
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.
Für Anregungen, Verbesserungen, Kritiken, positiv wie negativ, können Sie mich direkt unter meiner E-Mail-Adresse erreichen:
rainer@grimm-jaud.de
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.
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.
C++11 hat viel zu bieten:
Für den Einsteiger: einfacher zu lehren und zu lernen durch die vereinheitlichte Syntax und mächtige Bibliotheken, mit denen Standardaufgaben leichter gemeistert werden können.
Für den Einsteiger
Für den Profi: eine bessere Programmiersprache für die Systemprogrammierung und das Schreiben von Bibliotheken durch neue und verbesserte Features der Kernsprache und der Bibliotheken.
Für den Profi
Dabei baut die Multiparadigmen-Programmiersprache C++11 auf den Prinzipien von C++ auf.
Vertraue dem Programmierer.
Zahle nicht für etwas, das du nicht nutzt.
Brich keinen funktionierenden Code.
Kontrolle zur Übersetzungszeit ist besser als zur Laufzeit.