Was sind die neuen Funktionen in C ++ 17?

1007

C ++ 17 ist jetzt vollständig, sodass es unwahrscheinlich ist, dass große Änderungen vorgenommen werden. 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?

Yakk - Adam Nevraumont
quelle
26
Vollständige Liste der Funktionen gemäß Clang: Bibliothek , Kernsprache .
Kerrek SB
3
Dieser Blog hat eine schöne Zusammenfassung: bfilipek.com/2017/01/cpp17features.html
atb
13
Eine Liste der wichtigsten Änderungen von C ++ 14 zu C ++ 17 finden Sie im offiziellen Dokument Änderungen zwischen C ++ 14 und C ++ 17 DIS (P0636r0) .
Jotik
1
@ RaghavNavada Großartig! Wird der Abschnitt C ++ 20 beibehalten? Es gibt # 53 , aber es ist geschlossen ...
LF
Alles auf dieser Site en.cppreference.com/w/cpp ist mit der erforderlichen Version gekennzeichnet.
jw_

Antworten:

1266

Sprachmerkmale:

Vorlagen und generischer Code

Lambda

Attribute

Syntaxbereinigung

Sauberere Mehrweg- und Durchflussregelung

  • Strukturierte Bindungen

    • Grundsätzlich erstklassig std::tiemitauto
    • Beispiel:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Erzeugt Variablen itund insertedmit abgeleiteten Typ aus den , pairdass map::insertRenditen.
    • Funktioniert mit Tupel / Paar-Likes std::arrayund relativ flachen Strukturen
    • Tatsächlich benannte strukturierte Bindungen im Standard
  • if (init; condition) und switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Erweitert das if(decl)auf Fälle, in denen declConvertible-to-Bool nicht sinnvoll ist.
  • Verallgemeinern des Bereichs für Schleifen

    • Scheint hauptsächlich Unterstützung für Sentinels oder Enditeratoren zu sein, die nicht vom gleichen Typ wie Startiteratoren sind, was bei nullterminierten Schleifen und dergleichen hilft.
  • wenn constexpr

    • Vielgefragte Funktion zur Vereinfachung von fast generischem Code.

Sonstiges

Bibliothekserweiterungen:

Datentypen

  • std::variant<Ts...>

    • Fast immer nicht leer, als ich das letzte Mal nachgesehen habe?
    • 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 Referenz-auf-Zeichen-Array oder Teilzeichenfolge
    • Nie wieder nehmen string const&. Kann auch das Parsen einer Bajillion Mal beschleunigen.
    • "hello world"sv
    • constexpr char_traits
  • std::byte mehr weg, als sie kauen konnten.

    • Weder eine Ganzzahl noch ein Zeichen, nur Daten

Sachen aufrufen

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 verfügbar, wenn Sie sie nicht mit Threading verwenden

Einfädeln

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

Containerverbesserungen

Smart Pointer ändert sich

Weitere stdVerbesserungen des Datentyps:

Sonstiges

Züge

Veraltet

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

Natürlich wird die TS-Arbeit parallel fortgesetzt, daher gibt es einige nicht ganz reife TS, die 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.

Erste Liste aus diesem reddit-Beitrag und diesem reddit-Beitrag mit Links, die über googeln oder von der obigen Seite isocpp.org hinzugefügt wurden.

Zusätzliche Einträge aus der SD-6- Funktionstestliste.

Klirren der Feature - Liste und Bibliothek Feature - Liste sind neben ausgeplündert werden. 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, finden Sie hier eine kurze Liste einiger Dinge ((meistens?), Die zuvor veraltet waren), die in C ++ 17 aus C ++ entfernt wurden:

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 oben noch nicht integriert sind:

Spezifikationsänderungen:

Weitere Referenz:

Yakk - Adam Nevraumont
quelle
2
Ähm, memory_order_consumescheint nicht offiziell veraltet zu sein. In der Notiz wird nur davon abgeraten. Vielleicht ist es sinnvoll, dies zu erwähnen (zum Beispiel mit einer nachgestellten Klammer)?
LF