wake-up-neo.com

Was sind die neuen Funktionen in C ++ 17?

C++ 17 ist jetzt mit allen Funktionen ausgestattet, sodass große Änderungen unwahrscheinlich sind. Hunderte von Vorschlägen wurden für C++ 17 eingereicht.

Welche dieser Funktionen wurden in C++ 17 zu C++ hinzugefügt?

Welche dieser Funktionen stehen bei Verwendung eines C++ - Compilers, der "C++ 1z" unterstützt, zur Verfügung, wenn der Compiler auf C++ 17 aktualisiert wird?

965

Sprachmerkmale:

Vorlagen und generischer Code

Lambda

Attribute

Syntaxbereinigung

Cleaner Multirücklauf- und Durchflussregelung

  • Strukturierte Bindungen

    • Grundsätzlich erstklassig _std::tie_ mit auto
    • Beispiel:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Erstellt die Variablen it und inserted mit abgeleitetem Typ aus der pair, die _map::insert_ zurückgibt.
    • Funktioniert mit Tuple/pair-likes & _std::array_ und relativ flachen Strukturen
    • Tatsächlich strukturierte Bindungen im Standard
  • if (init; condition) UND switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Erweitert die if(decl) auf Fälle, in denen decl nicht sinnvoll in Bool konvertierbar ist.
  • Bereichsbezogene Verallgemeinerung für Schleifen

    • Scheint hauptsächlich Unterstützung für Sentinels oder End-Iteratoren zu sein, die nicht vom selben Typ sind wie Start-Iteratoren, was bei nullterminierten Schleifen und dergleichen hilft.
  • falls constexpr

    • Viel nachgefragtes Feature zur Vereinfachung von fast generischem Code.

Sonstiges

Bibliothekszusätze:

Datentypen

  • std::variant<Ts...>

    • Fast immer nicht leer, habe ich zuletzt nachgesehen?
    • Tagged Union-Typ
    • {genial | nützlich}
  • std::optional

    • Vielleicht hält einer von etwas
    • Lächerlich nützlich
  • std::any

    • Hält eines von allem (das kopierbar ist)
  • std::string_view

    • _std::string_ wie Verweis auf ein Zeichen-Array oder eine Teilzeichenfolge
    • Nie wieder einen _string const&_ nehmen. Kann auch das Parsen um eine Milliarde Mal schneller machen.
    • "hello world"sv
    • constexpr _char_traits_
  • std::byte mehr aus, als sie kauen konnten.

    • Weder eine Ganzzahl noch ein Zeichen, nur Daten

Zeug aufrufen

Dateisystem TS v1

Neue Algorithmen

  • _for_each_n_

  • reduce

  • _transform_reduce_

  • _exclusive_scan_

  • _inclusive_scan_

  • _transform_exclusive_scan_

  • _transform_inclusive_scan_

  • Wird zu Threading-Zwecken hinzugefügt und ist auch dann sichtbar, wenn Sie sie nicht verwenden

Einfädeln

(Teile von) Library Fundamentals TS v1 oben oder unten nicht behandelt

Container Verbesserungen

Smart Pointer ändert sich

Weitere Verbesserungen des Datentyps std:

Sonstiges

Züge

Veraltet

Isocpp.org hat hat eine unabhängige Liste der Änderungen seit C++ 14; es wurde teilweise geplündert.

Natürlich wird die TS-Arbeit parallel fortgesetzt, so dass es einige TS gibt, die nicht ganz reif sind und auf die nächste Iteration warten müssen. Das Ziel für die nächste Iteration ist C++ 20, wie zuvor geplant, nicht C++ 19, wie einige Gerüchte andeuten. C++ 1O wurde vermieden.

Die anfängliche Liste stammt aus dieser reddit-Beitrag und dieser reddit-Beitrag , wobei Links über googeln oder von der obigen isocpp.org-Seite hinzugefügt wurden.

Zusätzliche Einträge aus SD-6 Feature-Test-Liste geplündert.

Clangs Featureliste und Bibliotheks-Featureliste werden als nächstes geplündert. Dies scheint nicht zuverlässig zu sein, da es sich um C++ 1z und nicht um C++ 17 handelt.

diese Folien hatten einige Funktionen, die an anderer Stelle fehlten.

Während "Was wurde entfernt" nicht gefragt wurde, ist hier eine kurze Liste einiger (größtenteils?) Zuvor veralteter Dinge, die in C++ 17 aus C++ entfernt wurden:

Entfernt:

Es gab Umformulierungen. Ich bin mir nicht sicher, ob dies Auswirkungen auf den Code hat oder ob es sich lediglich um Aufräumarbeiten im Standard handelt:

Artikel, die oben noch nicht integriert sind:

  • P0505R (constexpr chrono)

  • P0418R2 (Atomic Tweaks)

  • P0512R (Template-Argument-Abzug optimiert)

  • P0490R (strukturierte Bindungsänderungen)

  • P0513R (ändert sich zu _std::hash_)

  • P0502R (parallele Ausnahmen)

  • P0509R1 (Aktualisierung der Einschränkungen für die Ausnahmebehandlung)

  • P0012R1 (Ausnahmespezifikationen müssen Teil des Typsystems sein)

  • P0510R (Einschränkungen für Varianten)

  • P0504R (Tags für optional/variant/any)

  • P0497R (gemeinsame PTR-Optimierungen)

  • P0508R (Knotenhandles für strukturierte Bindungen)

  • P0521R (gemeinsame Zeigeranzahl und eindeutige Änderungen?)

Spezifikationsänderungen:

Weitere Hinweise:

1230