Standard C++20 approvato

Comitato ISO per la standardizzazione del linguaggio C++ ha approvato standard internazionale «C++20«. Le funzionalità presentate nella specifica, ad eccezione di casi isolati, sono supportati nei compilatori GCC, Clang e Microsoft Visual C++. Le librerie standard compatibili con C++20 sono implementate nell'ambito del progetto Boost.

Nei prossimi due mesi, la specifica approvata sarà in fase di preparazione del documento per la pubblicazione, in cui verrà svolto il lavoro di editing per correggere errori di ortografia e refusi. All'inizio di novembre, la versione finale del documento sarà inviata all'ISO per la pubblicazione con il nome formale ISO/IEC 14882:2020. Nel frattempo, il comitato ha già iniziato a lavorare sul prossimo standard C++23 (C++2b) e nella prossima riunione virtuale esaminerà possibili novità.

Principali di rendering tramite WebGL e Canvas, C++20 (esempi di codice):

  • Sono state aggiunte «concetti», estensioni dei modelli che consentono di definire un insieme di requisiti per i parametri del modello, i quali durante la compilazione limitano l'insieme di argomenti che possono essere accettati come parametri del modello. I concetti possono essere utilizzati per evitare incoerenze logiche tra le proprietà dei tipi di dati utilizzati all'interno del modello e le proprietà dei tipi di dati dei parametri di ingresso.

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

  • Il pacchetto di unità è stato accettato estensione per lavorare con i moduli, che possono essere utilizzati al posto dei file di intestazione. I moduli forniscono un nuovo modo di organizzare i testi sorgente basato sulla definizione dei confini dei componenti, senza file di intestazione inclusi tramite «#include».
  • Il macro __VA_OPT__ per l'espansione adattiva dei macro variabili in base alla presenza di token nell'argomento variabile.
  • Supporto per l'operatore «» per il confronto trifacciale.
  • Supporto per gli inizializzatori di elementi predefiniti per i campi bit.
  • Possibilità di cattura delle espressioni «*this» nelle lambda.

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

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

  • Richiamo degli elementi tramite puntatore (Pointer-to-member), utilizzando puntatori definiti tramite l'espressione «const &» su oggetti temporanei.
  • Operatore delete con distruttore, descritto nel documento P0722R1.
  • È consentito l'uso di parametri del modello senza tipo per le classi.

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

    template
    auto get_foo() {
    return f;
    }

    get_foo(); // usa il costruttore implicito
    get_foo();

  • Espressioni lambda non salvate con costruttore.
  • Ammissibilità dell'uso della sintassi dei modelli per le espressioni lambda ("auto f = [](std::vector v)").
  • Possibilità di utilizzare letterali di stringa nei parametri del modello.
  • Supporto della sintassi di inizializzazione in stile C: i campi non esplicitamente elencati nella lista di inizializzazione vengono inizializzati per default.

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

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

  • Supporto per membri vuoti nelle strutture dati.
  • Supporto per gli attributi likely e unlikely per informare l'ottimizzatore sulla probabilità di attivazione della konstrukzione condizionale ("[[likely]] if (random > 0) {").
  • Possibilità di utilizzare intervalli per inizializzare i valori delle variabili nel ciclo "for".

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

  • Calcolo automatico della dimensione dell'array in new ("new double[]{1,2,3}");
  • Attributo "[[no_unique_address]]" per cui le variabili senza dati non occupano spazio.
  • Puntatori atomici (std::atomic<shared_ptr> e std::atomic<weak_ptr>).
  • Possibilità di chiamare funzioni virtuali nelle espressioni condizionali.
  • Supporto per funzioni immediate (immediate) che possono operare solo su costanti.

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

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // ERRORE: ‘x’ non può essere usato come costante

  • Possibilità di applicare constexpr a funzioni virtuali ("constexpr virtual int f() const { return 2; }").
  • Nella libreria standard:
    • Aggiunto supporto per il tipo char8_t per stringhe UTF-8.
    • Aggiunti i file di intestazione bit (operazioni bit) e version.
    • È stata aggiunta la possibilità di verificare il prefisso e il suffisso delle stringhe (starts_with, ends_with).
    • Aggiunti tipi come std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible e std::type_identity.
    • Aggiunte le funzioni std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated e std::assume_aligned.
    • In std::make_shared è stato aggiunto il supporto per gli array.
    • Aggiunta la funzione std::to_array per convertire oggetti simili a array in std::array.
  • Sintassi più conveniente per le enumerazioni:

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

  • Nell'indice, a causa di comportamenti indefiniti, l'uso dell'operazione «,» («a[b,c]») è vietato. È stata interrotta la supporto alla maggior parte delle operazioni con variabili dichiarate con la parola chiave volatile, incluse le operazioni «++» e «—» per i tipi standard.
  • Ridotto il numero di situazioni in cui è necessario indicare «typename» per informare dell'esistenza di un tipo.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster