Kapitel 21. Die nächsten C++-Standards

In diesem Kapitel:

Nach dem Standard ist vor dem Standard. Da stellt sich natürlich die Frage, welche Features der nächste C++-Standard besitzen sollte. Diese ist nicht eindeutig zu beantworten, da zwei neue C++-Standards in Planung sind. So soll es 2014 mit C++14 einen kleinen Standard geben, der die Fehler aus C++11 behebt. Und für 2017 ist mit C++17 ein großer Standard geplant, der C++ um viele neue Feature erweitert. Die Funktionalität des unmittelbar bevorstehenden C++-Standards C++14 ist zum jetzigen Zeitpunkt 2013 schon recht stabil.

C++14

Mit dem aktuellen GCC 4.9 steht ein Compiler zur Verfügung, mit dem sich viele der Verbesserungen des C++14-Standards schon anwenden lassen (C++1y/C++14 Support in Gcc, 2013).

Kernsprache

Mit generischen Lambda-Funktionen und dem vereinfachten Ermitteln des Rückgabetyps einer Funktion bietet C++14 zwei deutliche Verbesserungen gegenüber C++11 an.

Nicht nur die Kernsprache in C++14, auch die Standardbibliothek mit der Bibliothek zu optionalen Werten und dem neuen sequenziellen Container std::dynarray bietet sehr interessante Erweiterungen an.

Neben den Bibliotheken des „Technical Report 2“ (TR2), der in der bewährten Tradition des »Technical Report 1« (TR1) steht, sind natürlich die für C++11 geplanten Features, die nicht in den C++11-Standard aufgenommen wurden, heiße Kandidaten für C++17.

Für C++11 geplant

Mit Modulen, speziellen mathematischen Funktionen und insbesondere Concepts liegt die Messlatte für C++17 sehr hoch.

Module

Module stellen einen Mechanismus dar, Bibliotheken zusammenzupacken und ihre Implementierung zu kapseln. Damit soll die klassische Trennung von Übersetzungseinheit und Header-Datei in C++ aufgehoben werden, da Module an einer Stelle definiert werden können. Ursprünglich für C++11 angedacht, sollen sie in den nächsten Technical Report aufgenommen werden. David Vandevoorde stellt in dem Vorschlag (Proposal) »Modules in C++« (Vandevoorde, 2007) ihre drei primären Ziele dar:

Darüber hinaus sollen Module bekannte Probleme in C++ wie die Initialisierungsreihenfolge von Variablen lösen und dem Compiler weiteres Optimierungspotenzial an die Hand geben.

Es war schon eine große Überraschung, als im Juli 2009 Concepts aus dem C++11-Standard (Stroustrup, The C++0x “Remove Concepts” Decision, 2009) entfernt wurden. Dies geschah beim ISO C++-Standard Komitee Meeting in Frankfurt und war umso überraschender, da die Concepts als das wichtigste Feature für die generische Programmierung in C++ angesehen wurden – wichtig, um die Programmierung mit Templates auf eine theoretische Basis zu stellen, wichtig, um die Verwendung von Templates für den alltäglichen Gebrauch zu verbessern.

Was sind Concepts? Concepts sind ein Typsystem für Templates. Sie leisten in ähnlicher Weise das für die generische Programmierung, was Vererbung für die objektorientierte Programmierung tut. Ein Datentyp muss ein definiertes Interface anbieten, um in einem Algorithmus verwendet werden zu können. Wem die Typklassen von Haskell (The Haskell Programming Language, 2011) oder Scala bekannt sind, der wird viele Ähnlichkeiten zu den Concepts in C++ entdecken. Das kleine Listing 21.6 soll aufzeigen, welches Problem Concepts beim generischen Programmieren adressieren sollen.

concepts.cpp

Wird Listing 21.6 übersetzt, moniert der Compiler das (Abbildung 21.1) sofort.

Der Compiler weist in diesem Fall direkt auf den Fehler hin. Für den Datentyp MyInt ist kein kleiner Operator operator < definiert. Klar, er fehlt ja auch. Die Idee von Concepts ist es nun, dass der generische Algorithmus getMinimum die Bedingungen an seine Typparameter stellt.

Damit drückt die Signatur des Templates std::LessThanComparable explizit aus, welche Bedingungen ein Typparameter erfüllen muss, um verwendet werden zu können. Die Fehlermeldung soll dadurch deutlich einfacher zu lesen sein. Die Ist-Situation ist und bleibt aber, dass die Template-Implementierung im Fehlerfall daraufhin analysiert werden muss, welche Operation der konkrete Datentyp nicht unterstützt.

Die Funktionalität von Concepts umfasst die folgenden Bereiche:

Wer einen genaueren Einstieg in Concepts sucht, findet ihn auf Wikipedia (Concepts (C++), 2011).

Die entscheidende Frage, die noch im Raum steht, ist, was mit den Concepts passiert. Der Tenor in der C++-Community ist, dass sie in einer leichtgewichtigeren Form Bestandteil des C++17-Standards sein werden.

Viele Erweiterungen der Standardbibliothek von C++11 haben ihren Ursprung im Technical Report 1. Der Technical Report 1 wiederum bestand aus Bibliotheken der Boost-Bibliothek (boost, 2013), die schon länger im Einsatz waren. Dieses Verfahren hat sich bewährt und wird sich wohl nach C++11 fortsetzen. Der Technical Report 2 (TR2) umfasst schon einige etablierte Bibliotheken, die wiederum aus dem Boost-Umfeld stammen.

Boost

Boost, das im Jahr 2000 von Mitgliedern des C++-Standardisierungskomitees gegründet wurde, umfasst gut 100 freie C++-Bibliotheken. Diese zeichnen sich durch die folgenden Punkte aus. Sie

Der Aufruf für neue Vorschläge für den Technical Report 2 startete bereits 2005. Die Schwerpunkte in dem Proposal von Howard Hinnant, Beman Dawes und Matt Austern (Hinnant, Dawes, & Austern, 2005) sind:

Aus diesem Aufruf zu Vorschlägen sind einige konkrete Proposals hervorgegangen, die Bestandteil des Technical Report 2 sind. Die folgenden Vorschläge haben ihre Ursprünge in der Boost-Bibliothek. Sie sind alle schon länger im Einsatz und haben damit ihre erste Bewährungsprobe mit Bravour bestanden.