Maison  >  Article  >  développement back-end  >  Quelles sont les nouvelles fonctionnalités de c++17

Quelles sont les nouvelles fonctionnalités de c++17

青灯夜游
青灯夜游original
2021-01-29 11:57:1512814parcourir

Les nouvelles fonctionnalités de c++17 sont : 1. Les règles de dérivation automatique des expressions ont été modifiées ; 2. Les expressions Lambda peuvent capturer "*this" 3. De nouvelles variables en ligne peuvent être ajoutées directement au fichier ; Les variables globales sont définies dans les fichiers d'en-tête ; 4. Les instructions d'initialisation sont prises en charge dans les expressions conditionnelles. 5. Initialisation de liste directe des énumérations, etc.

Quelles sont les nouvelles fonctionnalités de c++17

L'environnement d'exploitation de ce tutoriel : système Windows 7, version C++17, ordinateur Dell G3.

Recommandations associées : "Tutoriel vidéo C++"

Nouvelles fonctionnalités en C++17

1. mot-clé auto

À partir de c++11, le mot-clé auto peut déduire le type de la variable via l'initialiseur. En C++14, la capacité du mot-clé auto est encore améliorée et le type de retour de la fonction peut être déduit via l'instruction return. L'utilisation du mot-clé auto peut améliorer l'efficacité du codage et simplifier le processus de reconstruction. Cependant, les résultats de la dérivation automatique en C++11 sont souvent différents de ceux attendus.

Afin de prendre en charge l'initialisation unifiée, une nouvelle syntaxe d'initialisation unifiée est introduite dans c++11, comme indiqué ci-dessous.

// 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>

Pour les variables initialisées de ces trois manières, le résultat final de la dérivation de type est std::initializer_list, pas int comme nous le pensons. En effet, lorsque l'expression utilisée pour déclarer une variable auto est entourée de {}, le type déduit devient std::initializer_list.

En C++17, les règles de dérivation des expressions automatiques ont été modifiées

// 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

La comparaison a révélé que auto x5{3} déduira directement la variable en x5, tandis que x3{ 1, 2} Cette méthode échouera également à compiler. Les règles de dérivation automatique deviennent plus intuitives.

2. L'expression lambda

lambda est également introduite en C++11. En C++11, l'expression lambda ne peut capturer que cela, c'est une lecture. seule référence à l’objet courant. En C++17, *this peut être capturé. *this est une copie de l'objet actuel La capture d'une copie de l'objet actuel peut garantir qu'après la libération de l'objet actuel, l'expression lambda peut appeler en toute sécurité les variables et les méthodes. ce.

3. Variables en ligne

Variables en ligne, les variables en ligne permettent de définir les variables plus d'une fois. Avant C++17, lorsque nous définissions des variables globales, nous devions toujours définir la variable dans le fichier cpp, puis utiliser le mot-clé extern pour indiquer au compilateur que la variable a été définie ailleurs. Une fois la variable en ligne apparue, nous pouvons définir directement la variable globale dans le fichier d'en-tête sans nous soucier du message d'erreur de redéfinition.

4. Les instructions d'initialisation sont prises en charge dans les expressions conditionnelles

C++17 prend en charge l'initialisation dans les instructions if ou switch L'émergence de cette fonctionnalité peut rendre le code plus The. simplicité.

// 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;
    }
}

Dans le morceau de code ci-dessus, puisque res est une variable temporaire et que nous ne voulons pas affecter le code suivant, nous utilisons une paire d'accolades pour limiter sa portée. Mais si vous utilisez la syntaxe de c++17 et initialisez res dans la condition if, le code sera plus concis

// 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;
}

La bibliothèque standard de c++17 a également été étendue et les données suivantes ont été ajouté Type :

1. std::variant

std::variant est une union de type sécurisé et une version améliorée de l'union prend en charge des données plus complexes. . Types, tels que map, string, etc.

2. std::optional

std::optional représente une valeur possible. Lorsque nous créons un objet via une fonction, nous utilisons généralement la fonction pour renvoyer le code d'erreur et renvoyer l'objet lui-même via les paramètres. Si vous renvoyez l'instance créée via facultatif, elle deviendra plus intuitive

std::optional fournit les méthodes suivantes :

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

std::any

Un conteneur de type sécurisé qui peut enregistrer n'importe quelle valeur

4 std::string_view

string_view J'ai d'abord utilisé la version boost, string_view en c. ++17 est similaire à boost. string_view peut être compris comme une référence en lecture seule à la chaîne d'origine. string_view lui-même ne demande pas de mémoire supplémentaire pour stocker les données de chaîne d'origine, mais enregistre uniquement l'adresse et la longueur de la chaîne d'origine. Dans de nombreux cas, nous ne traitons les chaînes que temporairement et n'avons pas besoin d'une copie de la chaîne d'origine. L'utilisation de string_view peut réduire les copies de mémoire inutiles et améliorer les performances du programme. Par rapport à l'utilisation de pointeurs de chaîne, string_view offre une meilleure encapsulation.

Il convient de noter que puisque string_view n'est pas propriétaire de la chaîne d'origine, vous devez faire attention au cycle de vie de la chaîne d'origine lorsque vous utilisez string_view. Lorsque la chaîne d'origine a été détruite, string_view ne peut plus être appelée.

Autres fonctionnalités :

De plus, C++17 ajoute également d'autres fonctionnalités, qui ne sont pas répertoriées une par une dans l'article.

  • l'expression bool ne peut pas utiliser ++, – ces deux opérateurs d'incrémentation (décrémentation) sont des exceptions en c++17

  • Déjà partie du système de types,

  • Initialisation de liste directe des énumérations

  • Liaison structurée

  • constexpr if expression

  • la carte prend en charge la fusion et l'extraction

Pour plus de connaissances liées à la programmation, veuillez visiter : Apprentissage en programmation ! !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn