Heim  >  Artikel  >  Backend-Entwicklung  >  Was sind die neuen Funktionen von C++17?

Was sind die neuen Funktionen von C++17?

青灯夜游
青灯夜游Original
2021-01-29 11:57:1512816Durchsuche

Die neuen Funktionen von C++17 sind: 1. Änderungen an den Regeln für die automatische Ausdrucksableitung; 2. Lambda-Ausdrücke können „*this“ erfassen; 3. Neue Inline-Variablen, globale Variablen können direkt in der Header-Datei definiert werden 4. Unterstützung von Initialisierungsanweisungen in bedingten Ausdrücken. 5. Direkte Listeninitialisierung von Aufzählungen usw.

Was sind die neuen Funktionen von C++17?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, C++17-Version, Dell G3-Computer.

Verwandte Empfehlungen: „C++ Video-Tutorial

Neue Funktionen in C++17

1. Auto-Schlüsselwort

Ab C++11 kann das Auto-Schlüsselwort initialisiert werden Leiten Sie den Typ der Variablen ab. In C++14 wurde die Fähigkeit des Schlüsselworts auto weiter verbessert und der Rückgabetyp der Funktion kann über die Return-Anweisung abgeleitet werden. Die Verwendung des Schlüsselworts auto kann die Codierungseffizienz verbessern und den Rekonstruktionsprozess vereinfachen. Allerdings weichen die Ergebnisse der automatischen Ableitung in C++11 oft von den Erwartungen ab.

Um die einheitliche Initialisierung zu unterstützen, wird in C++11 eine neue einheitliche Initialisierungssyntax eingeführt, wie unten gezeigt.

// c++11
auto x3{ 1, 2 }; // std::initializer_list<int>
auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int>
auto x5{ 3 };    // std::initializer_list<int>

Für Variablen, die auf diese drei Arten initialisiert wurden, ist das endgültige Ergebnis der Typableitung std::initializer_list und nicht int, wie wir denken. Dies liegt daran, dass der abgeleitete Typ zu std::initializer_list wird, wenn der zum Deklarieren einer Variablen auto verwendete Ausdruck in {} eingeschlossen ist.

In C++17 wurden die Regeln für die automatische Ausdrucksableitung geändert

// c++17
auto x3{ 1, 2 }; // error: not a single element
auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int>
auto x5{ 3 };    // decltype(x5) is int

Der Vergleich hat ergeben, dass auto x5{3} die Variable direkt in x5 ableitet und x3{1, 2} ebenfalls fehlschlägt. Die Regeln der automatischen Ableitung werden intuitiver.

2. Lambda-Ausdruck

Lambda wurde auch in C++11 eingeführt. In C++11 können Lambda-Ausdrücke nur diesen erfassen, der eine schreibgeschützte Referenz auf das aktuelle Objekt ist. In C++17 kann *dies eine Kopie des aktuellen Objekts erfasst werden, um sicherzustellen, dass der Lambda-Ausdruck die Variablen und Methoden sicher aufrufen kann Das.

3. Inline-Variablen

Inline-Variablen ermöglichen die mehrfache Definition von Variablen. Vor C++17 mussten wir beim Definieren globaler Variablen immer die Variable in der CPP-Datei definieren und dann das Schlüsselwort extern verwenden, um dem Compiler mitzuteilen, dass die Variable an anderer Stelle definiert wurde. Nachdem die Inline-Variable angezeigt wurde, können wir die globale Variable direkt in der Header-Datei definieren, ohne uns um die Neudefinitionsfehlermeldung kümmern zu müssen.

4. Initialisierungsanweisungen werden in bedingten Ausdrücken unterstützt.

C++17 unterstützt die Initialisierung in if- oder switch-Anweisungen. Das Aufkommen dieser Funktion kann den Code prägnanter machen.

// c++17之前
map<int, string> c = {{1,"a"}};
{
    auto res = c.insert(make_pair(2, "b"));
    if(!res.second) {
        cout << "key 1 exist" << endl;
    } else {
        cout << "insert success, value:" << res.first->second << endl;
    }
}

Da es sich im obigen Codeteil um eine temporäre Variable handelt und wir den nachfolgenden Code nicht beeinflussen möchten, verwenden wir ein Paar geschweifte Klammern, um den Gültigkeitsbereich einzuschränken. Wenn Sie jedoch die Syntax von C++ 17 verwenden und res in der if-Bedingung initialisieren, wird der Code prägnanter angezeigt

// c++17
map<int, string> c = {{1,"a"}};
if(auto res = c.insert(make_pair(2, "b")); !res.second ) {
    cout << "key 1 exist" << endl;
} else {
    cout << "insert success, value:" << res.first->second << endl;
}

Die Standardbibliothek von C++ 17 wurde ebenfalls erweitert und die folgenden Datentypen hinzugefügt:

1. std::variant

std::variant ist eine typsichere Union und eine erweiterte Version von Variant unterstützt komplexere Datentypen wie Map, String usw.

2 :: optional

std::optional stellt einen möglichen Wert dar. Wenn wir ein Objekt über eine Funktion erstellen, verwenden wir normalerweise die Funktion, um den Fehlercode zurückzugeben, und geben das Objekt selbst über die Parameter zurück. Wenn Sie die erstellte Instanz über optional zurückgeben, wird sie intuitiver.

std::optional bietet die folgenden Methoden:

has_value()   // 检查对象是否有值
value()       // 返回对象的值,值不存在时则抛出 std::bad_optional_access 异常
value_or()    // 值存在时返回值,不存在时返回默认值

3Ein typsicherer Container, der jeden Wert speichern kann

4. std::string_view

string_view Ich habe zuerst die Boost-Version verwendet und string_view in C++17 ähnelt Boost. string_view kann als schreibgeschützter Verweis auf die Originalzeichenfolge verstanden werden. string_view selbst beantragt keinen zusätzlichen Speicher zum Speichern der ursprünglichen Zeichenfolgendaten, sondern speichert nur die ursprüngliche Zeichenfolgenadresse und -länge. In vielen Fällen verarbeiten wir Zeichenfolgen nur vorübergehend und benötigen keine Kopie der Originalzeichenfolge. Durch die Verwendung von string_view können unnötige Speicherkopien reduziert und die Programmleistung verbessert werden. Im Vergleich zur Verwendung von String-Zeigern bietet string_view eine bessere Kapselung. Es ist zu beachten, dass Sie bei der Verwendung von string_view auf den Lebenszyklus der Originalzeichenfolge achten müssen, da string_view nicht Eigentümer der Originalzeichenfolge ist. Wenn der ursprüngliche String zerstört wurde, kann string_view nicht mehr aufgerufen werden.

Weitere Funktionen:

Darüber hinaus fügt C++17 einige weitere Funktionen hinzu, die im Artikel nicht einzeln aufgeführt sind.

bool-Ausdrücke können nicht ++ verwenden, - diese beiden Inkrementierungs- (Subtraktions-)Operatoren

  • Ausnahmen in C++17 sind Teil des Typsystems geworden,

  • Aufzählungen sind direkt Listeninitialisierung

  • Strukturierte Bindung

  • constexpr, wenn Ausdruck

  • map das Zusammenführen und Extrahieren unterstützt

Weitere Kenntnisse zum Thema Programmierung finden Sie unter: Programmieren lernen! !

Das obige ist der detaillierte Inhalt vonWas sind die neuen Funktionen von C++17?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn