C++17 – Was gibt’s Neues? Ein Überblick über die wichtigsten Erweiterungen

Seite: 2/3

Firma zum Thema

Automatische Typbestimmung für Konstruktoren von Templates

Bild 2: Für die auskommentierten, Konstruktoraufrufe ShowMe ohne eckigen Klammern ist ein C++17 Compiler notwendig.
Bild 2: Für die auskommentierten, Konstruktoraufrufe ShowMe ohne eckigen Klammern ist ein C++17 Compiler notwendig.
(Bild: Rainer Grimm)

Ein Funktions-Template kann seine Typ-Parameter von seinen Funktions-Argumenten ableiten. Aber das war für ein spezielles Funktions-Template nicht möglich: Den Konstruktor eines Klassen-Templates. Mit C++17 ist dieser Satz falsch. Der Konstruktor kann seine Typ-Parameter von seinen Konstruktor-Argumenten ableiten.

Die showMe Aufrufe in der main-Funktion des in Bild 2 gezeigten Beispiels konnte bereits der erste C++98-Standard übersetzen. Für die auskommentierten, anschließenden Konstruktoraufrufe ShowMe ohne eckigen Klammern ist ein C++17 Compiler notwendig. Mit diesem müssen keine eckigen Klammern mehr verwendet werden, um ein Klassen-Template zu instanziieren.

Bildergalerie
Bildergalerie mit 5 Bildern

Aber in C++17 geht es nicht nur um die Benutzerfreundlichkeit. Es geht auch in bekannter Manier um Performanz der Anwendung.

Vermeidung von Kopieren

RVO steht für Return Value Optimization und bedeutet, dass der Compiler unnötige Copy-Operation entfernen kann. Was bisher ein optionaler Optimierungsschritt war, muss der Compiler in C++17 verbindlich zusichern.

MyType func() {
    return MyType{};    // no copy with C++17
}
MyType myType = func();     // no copy with C++17

Zwei unnötige Copy-Operationen können in den paar Zeilen stattfinden. Die erste in der return Anweisung und die zweite in der Zuweisung des Ergebnisses. Mit C++17 darf das nicht mehr passieren.

Falls ein Feature nicht mehr notwendig oder seine Anwendung sehr fehleranfällig ist, sollte es entfernt werden. Genau das passiert in C++17 mit std::auto_ptr und Trigraphen.

std::auto_ptr und Trigraphen entfernt

std::auto_ptr ist der erste Smart Pointer in C++. Sein Job ist es, genau auf seine Ressource aufzupassen. Aber er besitzt ein großes Problem. Wenn ein std:auto_ptr kopiert wird, findet heimlich eine Move-Operation statt. Das ist der Grund, dass C++11 std::unique_ptr als Ersatz erhielt. Ein std::unique_ptr kann nicht kopiert werden.

Trigraphen sind drei Zeichen im Sourcecode, die wie ein Zeichen behandelt werden. Sie sind dann notwendig, wenn die Tastatur das gewünschte Zeichen nicht unterstützt.

Falls es ihr Ziel ist, unleserlichen Code in C++ zu schreiben, dann ist dies mit C++17 deutlich schwieriger, denn mit C++17 sind die folgenden Zeilen nicht mehr gültig.

Neue Bibliotheken

Ein std::string_view ist eine nicht-besitzende Referenz auf einen String. Diese repräsentiert eine Sequenz von Zeichen. Diese Sequenz von Zeichen kann ein C++-String oder ein C-String sein.

Eine Frage bleibt natürlich bestehen. Warum benötigen wir std::string_view? Warum haben Google, LLVM und Bloomberg bereits eine Implementierung eines String-View? Die Antwort ist einfach. Es ist sehr billig einen std::string_view zu kopieren. std::string_view benötigt nur zwei Informationen: einen Zeiger auf die Sequenz von Zeichen und deren Länge. Wie sie vermutlich schon vermuten, besteht std::string_view fast ausschließlich aus lesenden Operationen, die dem Interface des std::string folgen. Fast nur, denn er erhält die zwei neuen Methoden remove_prefix und remove_suffix (siehe Bild 3).

Bild 3: Ein Beispiel zur Verwendung von std::string_view.
Bild 3: Ein Beispiel zur Verwendung von std::string_view.
(Bild: Rainer Grimm)

Das Programm sollte kein großes Überraschungspotential bergen. Die std::string_view's erhalten in (1) und (3) ihre Referenz auf den C++-String und die Sequenz von Zeichen. In Ausdruck (2) werden alle führenden Nicht-Leerzeichen (strView.find_first_not_of(" ")) und in Ausdruck (4) alle abschließenden "\0"-Zeichen (strView2.find("\0")) entfernt.

Die Details zu std::string_view lassen sich schön auf cppreference.com nachlesen und das Programm bereits in Aktion bewundern.

(ID:45095872)