Feature einfrieren C ++ 20. Coroutinen, Module und mehr

Neulich fand in der amerikanischen Stadt Kona eine Sitzung des internationalen Normungsausschusses C ++ statt. Es war nicht nur ein Meeting, sondern ein Feature Freeze! Es können keine ernsthaften neuen Ideen mehr in den Standard eindringen. Es sind nur noch wenige Besprechungen übrig, um vorab genehmigte Dinge hinzuzufügen, Mängel zu korrigieren und Rauheiten zu beseitigen.

Sollten Module und Corutins in C ++ 20 erwartet werden, gibt es eine schnelle Bibliothek zum Formatieren der Ausgabe, kann sie mit Kalendern arbeiten, werden sie std :: stacktrace hinzufügen, wird der Compiler in einigen Fällen std :: move selbst aufrufen, werden sie std akzeptieren :: flat_map ? All dies und noch viel mehr erwartet Sie unter dem Schnitt.



Coroutinen TS


Die heißeste Debatte um Coroutinen brach aus. Das Komitee musste drei verschiedene Ansätze für Coroutinen prüfen und entscheiden, ob die bestehenden Coroutinen TS als Standard akzeptiert oder ein anderer Weg eingeschlagen werden sollte.

Die Wahl war nicht einfach, jeder Ansatz hat seine Nachteile und Vorteile:

  • N4775 :
    • + Es gibt keine Einschränkungen hinsichtlich der Tatsache, dass Coroutinen in der Header-Datei beschrieben werden sollten
    • - Es gibt keine strengen Garantien dafür, dass keine dynamische Zuordnung erfolgt
    • ± nicht die einfachste Schnittstelle ( P1477R0 behebt dies)
    • - hässliche Schlüsselwörter co_await und co_yield (Satz P1485R0 aus WP21 behebt dies)
    • + 3 Jahre in der Praxis angewendet

  • P1063R2 :
    • + keine dynamischen Zuordnungen
    • - Coroutinen müssen in der Header-Datei beschrieben sein oder Sie müssen sich selbst mit dem Löschen des Typs betrügen
    • - noch gruseligere Tastenoperatoren [<-] und [->]
    • - kein funktionierender Prototyp
    • - nicht die einfachste Schnittstelle zum Erstellen asynchroner Dinge

  • P1430R0 :
    • + keine dynamischen Zuordnungen
    • - Coroutinen müssen in der Header-Datei beschrieben werden, oder Sie müssen schlau mit dem Löschen des Typs selbst herauskommen
    • + keine gruseligen Stichwörter, alles ist glatt
    • + Corutin-Benutzer sehen keine beängstigenden Coroutine-Innenseiten (sehen Sie nicht einmal co_await-Analoga, alles funktioniert sofort)
    • - Der erste Vorschlag, der nie diskutiert wurde, erfordert eine Reihe von Verbesserungen
    • - Es ist unmöglich, auf aktuellen Technologien zu implementieren (Unterstützung für Strukturen mit dynamischer Größe erforderlich). Die Implementierung erfordert enorme Arbeitskosten
    • ± ein bisschen wie Rückrufnudeln


Nach langen Diskussionen wurden Coroutinen in C ++ 20 wie in Coroutines TS übernommen (mit co_ * -Präfixen und alten Anpassungspunkten).

Module


Die Diskussion der Module wurde von einem interessanten Dokument mit Leistungsmessungen beeinflusst:
P1441R0 . Die Ergebnisse können unterschiedlich interpretiert werden: von "Bestehende Montagesysteme und Implementierung von Modulen sind noch nicht ausreichend optimiert" bis zu "Module lassen sich mit der zunehmenden Komplexität des Projekts nicht gut skalieren".

Zusätzlich zu diesem Dokument erörterte der Ausschuss eine Reihe geringfügiger Änderungen an den aktuellen Modulen. Nach 15 Jahren Diskussion, Prototyping und Experimentieren mit Implementierungen wurden die Module in C ++ 20 übernommen.

Formatieren


Gute Nachrichten an alle! Wenn Sie in der Untergruppe Bibliothek keine schwerwiegenden Fehler finden, können Sie in C ++ 20 Zeichenfolgen sicher und sehr schnell formatieren. Verabschieden Sie sich von std :: ios , std :: locale und den anderen Schrecken der 90er! Python hat jetzt eine ähnliche Syntax für die sofortige Formatierung in C ++: P0645R5 .

Darüber hinaus wurde der Vorschlag zur Integration der neuen Formatierungs- und Kalenderzeiten P1361R0 angenommen . Wenn alles nach Plan läuft, können die Daten auf menschliche Weise angezeigt werden!

Netzwerk, Ausführende und Eigenschaften


Executoren sind ein wichtiger Baustein für die sofortige Unterstützung von Networking in C ++. Ausführende benötigen Eigenschaften - die Möglichkeit, den Datentyp abhängig von dem in der Kompilierungsphase übergebenen Parameter zu ändern, ohne das Konzept des Typs zu ändern.

Die Eigenschaften sind in P1393R0 beschrieben . Trotz der Tatsache, dass der Text für die Aufnahme in den Standard nur ein paar Seiten umfasst, löste der Vorschlag heftige Diskussionen aus. Mit dem Vorschlag können Sie nahezu allmächtige Anpassungspunkte festlegen und das Verhalten von Funktionen mithilfe von Eigenschaften ändern.

Aus diesem Grund wurde beschlossen, Eigenschaften nur in C ++ 23 in die Sprache aufzunehmen, und dementsprechend werden Executors und Networking in C ++ 20 nicht angezeigt.

Andere


Die folgenden Änderungen wurden bereits am C ++ 20-Entwurf vorgenommen:

  • Strukturen ohne Konstruktoren (Aggregate) können jetzt mit P0960- Klammern initialisiert werden. In der Praxis bedeutet dies, dass jetzt std :: make_shared , std :: make_unique , std :: * :: emplace * mit Aggregaten ohne Kompilierungsfehler korrekt funktioniert
  • Lerp- Funktionen für die lineare Interpolation P0811 wurden hinzugefügt
  • Es wurde die Möglichkeit hinzugefügt, die Algorithmen der Standardbibliothek P1001 zu vektorisieren
  • Die std :: span- Methoden geben jetzt vorzeichenlose Typen zurück (ähnlich der gesamten Standardbibliothek). + Die Funktion std :: ssize wurde hinzugefügt, um die Größe des Containers als vorzeichenbehaftete Nummer P1227 zu ermitteln
  • Ungeordnete Container lernten, wie man Werte mit einem vorberechneten Hash von P0920 nachschlägt

Viele andere Dinge warten auf die endgültige Überprüfung in den Untergruppen Bibliothek und Kern, um in C ++ 20 aufgenommen zu werden:

  • Effektives Warten auf std :: atomic; Semaphor- und Barriereklassen P1135
  • std :: flat_map P0429
  • std :: flat_set P1222
  • std :: function_ref P0792
  • constexpr für <cmath> und <cstdlib> P0533
  • std :: range :: to <any-container> zum Speichern eines Wertebereichs in einem P1206- Container
  • Die Fähigkeit, Zeichenfolgen effizient aus std :: * stringstream zu extrahieren und benutzerdefinierte Zeichenfolgen P0408 zu übertragen
  • Mehrere Änderungen für Operator <=> , Bereiche, constexpr

Verdienste von RG21


Am ersten Tag nahm die Core-Untergruppe den geliebten Yandex.Taxi-Vorschlag für den Stacktrace P0881R3 auf . Designkommentare wurden in der LEWG-Untergruppe weiter diskutiert, die erneut in Core ausgearbeitet wurde. Infolgedessen wurden im Laufe der Woche Korrekturen vorgenommen und Diskussionen geführt. Der Vorschlag ist noch nicht im Standardentwurf enthalten, sollte jedoch in C ++ 20 enthalten sein (wenn plötzlich ein schwerwiegender Fehler auftritt).

Vor der Erörterung unserer Idee von P1485R0 , Schlüsselwörter für Coroutine zu verwenden, wurde keine Schlussfolgerung gezogen.

Ebenfalls bei SG1 diskutierte Concurrency die Idee einer gleichzeitigen ungeordneten Karte P0652R2 . Wir wurden gebeten, noch einmal zu überprüfen, ob die vorgeschlagene API Leserkonflikte vermeidet. Sie sollen auch gleichzeitig ungeordnete Container untersuchen, die nicht über die Löschfunktion verfügen und den Wert des Containers nicht vor Wettbewerbsänderungen schützen.

Das Angebot von ZaMaZaN4iK , std :: hash für verschiedene Klassen der Standardbibliothek P1406R0 zu spezialisieren, wurde stark gekürzt. Das Komitee empfahl, Spezialisierungen nur für std :: pair , std :: tuple , std :: array und std :: basic_string von Benutzerzuordnungen zu belassen .

In einer Teilmenge von Zahlen diskutierte SG6 einen Mechanismus für die Interaktion verschiedener neuer Klassen von Zahlen P0880R2 . Mit dem Vorschlag können Sie zwei Vorlagen spezialisieren, einen vollständigen Satz mathematischer Operationen und Vergleiche für alle neuen Typen erhalten. Nach der Diskussion beschlossen sie, den Mechanismus so zu erweitern, dass er nicht nur für die Anforderungen der Standardbibliothek verwendet werden kann, sondern auch Benutzer diese Operatoren für ihre Typen verwenden können.

Wir haben auch unsere kleineren Vorschläge besprochen, einschließlich des Funktionstestmakros P1424R0 und Richtlinien zum Hinzufügen dieser zum Standard.

Wir diskutierten schnell unsere Idee, dem Compiler zu erlauben, unnötige Kopien von R0889R1 zu entfernen. Wir wurden aufgefordert, die Arbeit in diese Richtung fortzusetzen, und haben Beispiele angeführt, die nicht gegen die neuen Regeln verstoßen sollten.

Anstelle von Summen


C ++ 20 unterscheidet sich genauso stark von C ++ 17 wie C ++ 11 von C ++ 03. Eine Vielzahl neuer Technologien und neuer Paradigmen: Konzepte, Verträge, Bereiche, Module, Coroutinen, Constexpr-Container und Constexpr-Dynamischer Polymorphismus, "Nibloide" usw.

In Kürze werden wir, Arbeitsgruppe 21, Kommentare zu einem Entwurf eines C ++ 20-Standards veröffentlichen. Wenn Sie Schmerzen haben oder mit einer Innovation nicht einverstanden sind, hinterlassen Sie bitte Ihre Gedanken auf dieser Seite .

Die nächste Sitzung des internationalen Komitees findet im Sommer statt, bei der Innovationen für C ++ 23 in Betracht gezogen werden können. Wenn Sie etwas in C ++ ändern oder Ihre Idee vorschlagen möchten, können Sie jederzeit auf https://stdcpp.ru/ schreiben, wo Leute von WP21 Ihnen helfen, Ihre Wünsche an das Komitee zu übermitteln.

Möchten Sie live mit uns sprechen? Ein offenes Treffen von RG21 wird in Kürze stattfinden . Seien Sie gespannt auf Ankündigungen unter events.yandex.ru . Besuchen Sie uns auch auf der C ++ Russland- Konferenz im April in Moskau.

Source: https://habr.com/ru/post/de438864/


All Articles