La norme C++20 a été approuvée.

Comité ISO pour la normalisation du langage C++ a approuvé norme internationale «C++20«. Les fonctionnalités présentées dans la spécification, à quelques exceptions près, sont soutenus dans les compilateurs GCC, Clang et Microsoft Visual C++. Les bibliothèques standard supportant C++20 sont mises en œuvre dans le cadre du projet Boost.

Au cours des deux mois suivants, la spécification approuvée se trouvera en phase de préparation du document à la publication, au cours de laquelle un travail sera effectué pour corriger les erreurs d'orthographe et les coquilles. Début novembre, la version résultante du document sera envoyée à l'ISO pour publication sous le nom formel ISO/IEC 14882:2020. En attendant, le comité a déjà commencé à travailler sur la prochaine norme C++23 (C++2b) et examinera les possibles nouveautés.

Principales caractéristiques C++20 (exemples de code):

  • Des « concepts » ont été ajoutés, des extensions de templates permettant de définir un ensemble d'exigences pour les paramètres de template, qui limitent à la compilation l'ensemble des arguments pouvant être pris comme paramètres de template. Les concepts peuvent être utilisés pour éviter les incohérences logiques entre les propriétés des types de données utilisés à l'intérieur du template et les propriétés des types de données des paramètres d'entrée.

    template
    concept EqualityComparable = requires(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Font partie de l'adoption les extensions pour travailler avec des modules, qui peuvent être utilisés à la place des fichiers d'en-tête. Les modules offrent un nouveau moyen d'organiser le code source sur la base de la définition des limites des composants, sans les fichiers d'en-tête inclus par « #include ».
  • Macron __VA_OPT__ pour la décomposition adaptative des macros variadiques en fonction de la présence de jetons dans l'argument variadique.
  • Support de l'opérateur « » pour la comparaison tripartite.
  • Support des initialisateurs d'éléments par défaut pour les champs de bits.
  • Possibilité de capture de l'expression « *this » dans une lambda.

    struct int_value {
    int n = 0;
    auto getter_fn() {
    // BAD:
    // return [=]() { return n; };

    // GOOD:
    return [=, *this]() { return n; };
    }
    };

  • Appel d'éléments par pointeur (Pointer-to-member), en utilisant des pointeurs vers des objets temporaires définis par l'expression « const & ».
  • L'opérateur delete avec un destructeur, décrit dans le document P0722R1.
  • Aux classes est permis d'utiliser des paramètres de template sans type.

    struct foo {
    foo() = default;
    constexpr foo(int) {}
    };

    template
    auto get_foo() {
    return f;
    }

    get_foo(); // utilise le constructeur implicite
    get_foo();

  • Expressions lambda non sauvegardées avec constructeur.
  • Admissibilité de l'utilisation de la syntaxe des modèles pour les expressions lambda («auto f = [](std::vector v)»).
  • Possibilité d'utiliser des littéraux de chaîne dans les paramètres de modèle.
  • Prise en charge de la syntaxe d'initialisation de style C — les champs non explicitement énumérés dans la liste d'initialisation sont initialisés par défaut.

    struct A {
    int x;
    int y;
    int z = 123;
    };

    A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2

  • Prise en charge des membres vides dans les structures de données.
  • Prise en charge des attributs likely et unlikely pour informer l'optimiseur de la probabilité d'exécution d'une condition («[[likely]] if (random > 0) {«).
  • Possibilité d'utiliser des plages pour initialiser les valeurs d'une variable dans une boucle «for»

    for (auto v = std::vector{1, 2, 3}; auto& e : v) {

  • Calcul automatique de la taille d'un tableau dans new («new double[]{1,2,3}»);
  • Attribut «[[no_unique_address]]» où les variables sans données ne prennent pas d'espace.
  • Pointeurs atomiques (std::atomic<shared_ptr> et std::atomic<weak_ptr>).
  • Possibilité d'appeler des fonctions virtuelles dans des expressions conditionnelles.
  • Prise en charge des fonctions immédiates qui ne peuvent fonctionner qu'avec des constantes.

    consteval int sqr(int n) {
    return n * n;
    }

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // ERREUR : 'x' ne peut pas être utilisé comme constante

  • Possibilité d'appliquer constexpr avec des fonctions virtuelles («constexpr virtual int f() const { return 2; }»).
  • Dans la bibliothèque standard :
    • Ajout de la prise en charge du type char8_t pour les chaînes UTF-8.
    • Ajout des fichiers d'en-tête bit (opérations sur les bits) et version.
    • Ajout de la possibilité de vérifier les préfixes et suffixes des chaînes (starts_with, ends_with).
    • Ajout des types std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible et std::type_identity.
    • Ajout des fonctions std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated et std::assume_aligned.
    • Ajout de la prise en charge des tableaux dans std::make_shared.
    • Ajout de la fonction std::to_array pour convertir des objets similaires à des tableaux en std::array.
  • Syntaxe d'énumération plus pratique :

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

  • L'utilisation de l'opération ',' ('a[b,c]') est interdite dans les index en raison d'un comportement indéfini. La prise en charge de la plupart des opérations sur les variables déclarées avec le mot-clé volatile a été arrêtée, y compris l'interdiction des opérations '++' et '—' sur les types standards.
  • Le nombre de situations nécessitant l'indication de 'typename' pour signaler la présence d'un type a été réduit.

Source : opennet.ru

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster