Der ISO-Ausschuss fĂŒr die Standardisierung der Programmiersprache C++ den internationalen Standard ââ. Die in der Spezifikation beschriebenen Möglichkeiten werden, mit Ausnahme einzelner FĂ€lle, GCC , und Boost .
Merkmale .
():
- template
concept EqualityComparable = requires(T a, T b) {
{ a == b } -> std::boolean;
{ a != b } -> std::boolean;
In die angenommenen
}; - Erweiterungen Das Makro __VA_OPT__ fĂŒr die adaptive Entfaltung variabler Makros in AbhĂ€ngigkeit von der VerfĂŒgbarkeit von Tokens im variablen Argument.
- UnterstĂŒtzung des Operators ââ fĂŒr den dreifachen Vergleich.
- UnterstĂŒtzung von Standardwertinitialisierern fĂŒr Bitfelder.
- Möglichkeit des Lambda-Zugriffs auf AusdrĂŒcke â*thisâ.
- struct int_value {
int n = 0;
auto getter_fn() {
return [=, *this]() { return n; };
// BAD:
// return [=]() { return n; };// GOOD:
Aufruf von Elementen ĂŒber einen Zeiger (Pointer-to-member), unter Verwendung von ĂŒber den Ausdruck âconst &â definierten Zeigern auf temporĂ€re Objekte.
}
}; - Der Operator delete mit einem im Dokument beschriebenen Destruktor
- P0722R1 .
- struct foo {
foo() = default;
constexpr foo(int) {}
template
};template
auto get_foo() {
return f;
}get_foo(); // verwendet impliziten Konstruktor
get_foo(); - Nicht speicherbare Lambda-AusdrĂŒcke mit Konstruktor.
- ZulĂ€ssigkeit der Verwendung von Vorlagen-Syntax fĂŒr Lambda-AusdrĂŒcke ("auto f = [](std::vector v)").
- Möglichkeit der Verwendung von String-Literalen in Vorlagen-Parametern.
- UnterstĂŒtzung der C-Stil Initialisierungssyntax â nicht explizit aufgelistete Felder in der Initialisierungsliste werden standardmĂ€Ăig initialisiert.
struct A {
int x;
int y;
int z = 123;
};A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2
- UnterstĂŒtzung leerer Mitglieder in Datenstrukturen.
- UnterstĂŒtzung der Attribute likely und unlikely zur Informierung des Optimierers ĂŒber die Wahrscheinlichkeit des Eintretens einer Bedingung ("[[likely]] if (random > 0) {").
- Möglichkeit, Bereiche zur Initialisierung von Variablenwerten in der "for"-Schleife zu verwenden
for (auto v = std::vector{1, 2, 3}; auto& e : v) {
- Automatische Berechnung der Array-GröĂe bei new ("new double[]{1,2,3}");
- Attribut "[[no_unique_address]]", wobei variablen ohne Daten keinen Platz beanspruchen.
- Atomare Zeiger (std::atomic<shared_ptr> und std::atomic<weak_ptr>).
- Möglichkeit, virtuelle Funktionen in bedingten AusdrĂŒcken aufzurufen.
- UnterstĂŒtzung fĂŒr sofortige Funktionen, die nur mit Konstanten arbeiten können.
consteval int sqr(int n) {
return n * n;
}constexpr int r = sqr(100); // OK
int x = 100;
int r2 = sqr(x); // FEHLER: 'x' kann nicht als Konstante verwendet werden - Möglichkeit, constexpr mit virtuellen Funktionen zu verwenden ("constexpr virtual int f() const { return 2; }").
- In der Standardbibliothek:
- UnterstĂŒtzung fĂŒr den Typ char8_t fĂŒr UTF-8-Strings wurde hinzugefĂŒgt.
- Die Header-Dateien bit (bitweise Operationen) und version wurden hinzugefĂŒgt.
- Möglichkeit zur ĂberprĂŒfung von PrĂ€fixen und Suffixen von Strings (starts_with, ends_with).
- Die Typideen std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible und std::type_identity wurden hinzugefĂŒgt.
- Funktionen wie std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated und std::assume_aligned wurden hinzugefĂŒgt.
- std::make_shared unterstĂŒtzt jetzt Arrays.
- Die Funktion std::to_array wurde hinzugefĂŒgt, um array-Ă€hnliche Objekte in std::array zu konvertieren.
- Ein benutzerfreundlicherer Syntax fĂŒr AufzĂ€hlungen:
enum class rgba_color_channel { red, green, blue, alpha };
std::string_view to_string(rgba_color_channel my_channel) {
switch (my_channel) {
using enum rgba_color_channel;
case red: return "red";
case green: return "green";
case blue: return "blue";
case alpha: return "alpha";
}
} - In den Indizes ist die Verwendung der Operation â,â (âa[b,c]â) aufgrund unbestimmten Verhaltens verboten. Die UnterstĂŒtzung fĂŒr die meisten Operationen mit Variablen, die mit dem SchlĂŒsselwort volatile deklariert sind, wurde eingestellt, einschlieĂlich der Operationen â++â und âââ mit Standardtypen.
- Die Anzahl der Situationen, in denen âtypenameâ zur Information ĂŒber die Existenz eines Typs angegeben werden muss, wurde reduziert.
Quelle: opennet.ru
