Frage Was sind die neuen Funktionen in C ++ 17?


C ++ 17 ist jetzt Feature abgeschlossen, so dass große Änderungen unwahrscheinlich sind. Hunderte Vorschläge wurden für C ++ 17 unterbreitet.

Welche dieser Features wurden C ++ in C ++ 17 hinzugefügt?

Wenn Sie einen C ++ - Compiler verwenden, der "C ++ 1z" unterstützt, welche dieser Features werden verfügbar sein, wenn der Compiler auf C ++ 17 aktualisiert?


831
2018-06-27 18:06


Ursprung


Antworten:


Sprachmerkmale:

Vorlagen und generischer Code

Lambda

Attribute

Syntaxbereinigung

Saubere Multi-Return- und Flow-Kontrolle

  • Strukturierte Bindungen

    • Grundsätzlich erstklassig std::tie mit auto
    • Beispiel:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Erstellt Variablen it und inserted mit abgeleiteten Typ aus der pair Das map::insert kehrt zurück.
    • Funktioniert mit Tupel / Paar-Likes & std::arrays und relativ flache Strukturen
    • Eigentlich benannt 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) zu Fällen, in denen decl ist nicht vernünftig umwandelbar.
  • Verallgemeinerung von bereichsbasierten for-Schleifen

    • Scheint hauptsächlich Unterstützung für Sentinels oder End-Iteratoren zu sein, die nicht den gleichen Typ wie begin iterators haben, was bei Null-terminierten Schleifen und ähnlichem hilft.
  • wenn consExpr

    • Viel nachgefragtes Feature, um fast-generischen Code zu vereinfachen.

Verschiedenes

Bibliothekserweiterungen:

Datentypen

  • std::variant<Ts...>

    • Fast immer nicht leer zuletzt überprüft?
    • Gekennzeichneter Unionstyp
    • {fantastisch | nützlich}
  • std::optional

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

    • Hält irgendwas (das ist kopierbar)
  • std::string_view

    • std::string wie Referenz-zu-Zeichen-Array oder Teilstring
    • Nimm niemals a string const& nochmal. Auch kann Parsing eine Bailillion mal schneller machen.
    • "hello world"sv
    • Constexpr char_traits
  • std::byte weg mehr als sie kauen konnten.

    • Weder eine ganze Zahl noch ein Zeichen, nur Daten

Ruft Zeug an

Dateisystem TS v1

Neue Algorithmen

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • Für Threading-Zwecke hinzugefügt, auch wenn Sie sie nicht mit Threads verwenden

Threading

(Teile von) Bibliotheksgrundlagen TS v1 nicht oben oder unten abgedeckt

Container Verbesserungen

Smart Pointer ändert sich

Andere std Verbesserungen des Datentyps:

Verschiedenes

Züge

Veraltet

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

Natürlich läuft die TS-Arbeit parallel weiter, also gibt es einige TS, die nicht ganz reif sind, die auf die nächste Iteration warten müssen. Das Ziel für die nächste Iteration ist C ++ 20 wie vorher geplant, nicht C ++ 19, wie einige Gerüchte implizieren. C ++ 1O wurde vermieden.

Anfangsliste entnommen aus Dieser reddit Beitrag und Dieser reddit Beitrag, mit Links, die über googling oder von der obigen isocpp.org Seite hinzugefügt wurden.

Zusätzliche Einträge geplündert von SD-6 Feature-Testliste.

die Feature-Liste von clang und Bibliotheksmerkmalsliste werden als nächstes geplündert. Dies scheint nicht zuverlässig zu sein, da es C ++ 1z, nicht C ++ 17 ist.

diese Folien hatte einige Funktionen, die woanders fehlen.

Während "Was wurde entfernt" wurde nicht gefragt, hier ist eine kurze Liste von ein paar Dinge (meist?) Zuvor veraltet), die in C ++ 17 aus C ++ entfernt werden:

Entfernt:

Es gab Umformulierungen. Ich bin mir nicht sicher, ob diese Auswirkungen auf den Code haben oder ob es sich nur um Bereinigungen im Standard handelt:

Papiere, die noch nicht oben integriert sind:

  • P0505R0 (constexpr chrono)

  • P0418R2 (atomare Verbesserungen)

  • P0512R0 (Vorlagenargumentabzug zwickt)

  • P0490R0 (strukturierte Bindung zwickt)

  • P0513R0 (ändert sich zu std::hash)

  • P0502R0 (parallele Ausnahmen)

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

  • P0012R1 (Exception-Spezifikationen müssen Teil des Typsystems sein)

  • P0510R0 (Einschränkungen für Varianten)

  • P0504R0 (Tags für optional / Variante / beliebig)

  • P0497R0 (geteilte ptr zwickt)

  • P0508R0 (strukturierte Bindungen Knotenpunkte)

  • P0521R0 (Anzahl der gemeinsamen Zeiger und einmalige Änderungen?)

Spezifikationsänderungen:

Weitere Referenz:


1051
2018-06-27 18:06