C++17: Kleinvieh macht auch Mist

Seite 4: Kleinigkeiten & Fazit

Inhaltsverzeichnis

Neben der ausführlichen Aufstellung gilt es noch auf ein paar weitere Sprachmittel hinzuweisen:

  • static_assert() benötigt nicht mehr unbedingt den zweiten Message-Parameter.
  • C++ unterstützt nun einzelne UTF8-Zeichen vom Typ char.
  • Die Reihenfolge der Auswertung von Operanden ist bei allen Operatoren fest definiert.
  • Mit __has_include ist im Präprozessor die Prüfung auf das Vorhandensein einer Header-Datei möglich.
  • Es gibt einige neue Attribute (C++-Annotationen): [[fallthrough]], [[nodiscard]], [[maybe_unused]] und unbekannte Attribute führen nicht mehr zu Warnungen.
  • Entwickler können Aggregaten (z.B. herkömmlichen C-Strukturen), die sie über Vererbung um neue Komponenten und Funktionen erweitern, direkt im Konstruktor Werte zur Initialisierung der Basisklasse mitgeben. Sie müssen keinen speziellen Konstruktor mehr definieren.
  • Lambdas dürfen in constexpr-Ausdrücken enthalten sein oder sie enthalten.
  • Das this-Objekt kann nun bei der Übergabe an Lambdas kopiert werden.
  • Das Wegoptimieren von Copy-Move-Konstruktoren beim Initialisieren mit oder Zurückliefern von temporären Objekten ist nicht mehr optional, sondern verpflichtend. Damit muss für das Übergeben oder Zurückliefern von Objekten nicht mehr unbedingt ein aufrufbarer Copy-Move-Konstruktor vorhanden sein. Die Optimierungen beim Zurückliefern von Objekten mit Namen (lvalues) sind weiterhin optional.
  • Die Sprache definiert jetzt genauer, was "Forward Progress" bedeutet, um bessere Garantien zu geben, wie sich parallele Threads zueinander verhalten.
  • Mit dem neuen Type-Trait has_unique_object_representations können Entwickler nun feststellen, ob ein Objekt für einzelne Werte immer die gleichen Bytes verwendet. Ist das der Fall, können sie für einen Hash-Wert einfach die Bytes verwenden.
  • noexcept in Signaturen ist nun Teil des Typsystems.

Obwohl die großen neuen Sprachmittel fehlen, die das Programmieren in C++ grundsätzlich ändern, kann man von einer guten Weiterentwicklung sprechen. Unter dem Motto "Kleinvieh macht auch Mist" geht in C++17 einiges mehr oder bequemer als vorher. Das alleine kann sehr positive Effekte haben – als Beispiel aus der Vergangenheit seien zwei kleine Änderungen von C++11 genannt: auto und range-based for-Schleifen. Zumal in C++17 noch Etliches an Bibliotheken hinzukommt, mit denen sich der zweite Teil der Artikelminiserie beschäftigt.

Dass sich die neuen Sprachmittel in Grenzen halten, hat auch sein Gutes: Es sind keine oder nur wenige grundsätzliche Umbauten in Compilern erforderlich. Damit können die Werkzeughersteller die Integration von C++17 schnell umsetzen. Die meisten Features sind in dem ein oder anderen Compiler bereits in Arbeit oder experimentell vorhanden.

Nicolai Josuttis
ist seit dem ersten C++-Standard an der Standardisierung von C++ aktiv beteiligt und hat mehrere Bücher zu der Programmiersprache geschrieben (darunter das weltweite Standardwerk "The C++ Standard Library"). Er gibt Schulungen zum Umstieg auf modernes C++ wie C++11, C++14 oder jetzt auch C++17.
(rme)