Approvato lo standard C++20

Comitato ISO per la standardizzazione del linguaggio C++ approvato standard internazionale "C ++ 20". Le capacità presentate nelle specifiche, ad eccezione di casi isolati, supportato nei compilatori GCC, clangore и Microsoft Visual C ++. Le librerie standard che supportano C++20 sono implementate all'interno del progetto Potenzia.

Nei prossimi due mesi il disciplinare approvato entrerà nella fase di preparazione del documento per la pubblicazione, durante la quale si lavorerà sulla correzione editoriale degli errori di ortografia e di battitura. All’inizio di novembre, il documento risultante sarà inviato 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 valuterà le possibili opzioni nella prossima riunione virtuale. innovazioni.

Il principale caratteristiche C ++ 20 (esempi di codice):

  • Aggiunti "concetti", estensioni del modello, che consentono di definire un insieme di requisiti dei parametri del modello che, in fase di 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à del tipo di dati dei parametri di input.

    modello
    concetto UguaglianzaComparabile = richiede(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Accettato espansione per lavorare con moduli che possono essere utilizzati al posto dei file header. I moduli forniscono un nuovo modo di organizzare il codice sorgente basato sulla definizione dei limiti dei componenti, senza includere file di intestazione tramite "#include".
  • Macro __VA_OPT__ per l'espansione adattiva delle macro variabili in base alla presenza di token nell'argomento variabile.
  • Supporto per l'operatore "" per il confronto a tre vie.
  • Supporto per inizializzatori di elementi predefiniti per bitfield.
  • Possibilità di acquisire lambda le espressioni "*this".

    struttura valore_int {
    intn = 0;
    getter_fn automatico() {
    //CATTIVO:
    // ritorno [=]() { ritorno n; };

    // BENE:
    return [=, *questo]() { return n; };
    }
    };

  • Chiamare elementi tramite puntatore (Pointer-to-member), utilizzando puntatori a oggetti temporanei definiti tramite l'espressione “const &”.
  • L'operatore delete con un distruttore descritto nel documento P0722R1.
  • Le classi possono utilizzare i parametri del modello senza un tipo.

    struttura foo {
    foo() = predefinito;
    constexpr foo(int) {}
    };

    modello
    get_foo automatico() {
    ritorno f;
    }

    get_pippo(); // utilizza il costruttore implicito
    get_foo ();

  • Espressioni lambda non persistenti con costruttore.
  • Consentire la sintassi del modello per le espressioni lambda (“auto f = [] (std::vettore v)").
  • Possibilità di utilizzare valori letterali stringa nei parametri del modello.
  • Supporto per la sintassi di inizializzazione in stile C: i campi non esplicitamente elencati nell'elenco di inizializzazione vengono inizializzati per impostazione predefinita.

    struttura A {
    int x;
    int y;
    intero z = 123;
    };

    A a {.x = 1, .z = 2}; // ax == 1, ay == 0, az == 2

  • Supporto per membri di strutture dati vuoti.
  • Supporto per gli attributi probabile e improbabile per informare l'ottimizzatore sulla probabilità che il costrutto condizionale venga attivato (“[[probabile]] se (casuale > 0) {“).
  • Possibilità di utilizzare intervalli per inizializzare i valori delle variabili in un ciclo "for".

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

  • Calcolo automatico della dimensione dell'array in new (“new double[]{1,2,3}”);
  • L'attributo “[[no_unique_address]]” in cui le variabili senza dati non occupano spazio.
  • Puntatori atomici (std::atomic > e std::atomic >).
  • Capacità di chiamare funzioni virtuali in espressioni condizionali.
  • Supporto per funzioni immediate che possono funzionare solo con costanti.

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

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

  • Possibilità di utilizzare constexpr con funzioni virtuali (“constexpr virtual int f() const { return 2; }”).
  • Nella libreria standard:
    • Aggiunto il supporto per il tipo char8_t per le stringhe UTF-8.
    • Aggiunti file di intestazione bit (operazioni bit) e versione.
    • Ora è possibile verificare il prefisso e il suffisso delle stringhe (inizia_con, finisce_con).
    • Aggiunti i tratti std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible e std::type_identity.
    • Aggiunte funzioni std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated e std::assume_aligned.
    • Aggiunto il supporto per gli array a std::make_shared.
    • Aggiunta la funzione std::to_array per convertire oggetti simili ad array in std::array.
  • Sintassi di enumerazione più conveniente:

    enum class rgba_color_channel { rosso, verde, blu, alfa };

    std::string_view to_string(rgba_color_channel mio_canale) {
    cambia (mio_canale) {
    utilizzando l'enumerazione rgba_color_channel;
    case red: restituisce "rosso";
    case green: restituisce "verde";
    case blue: restituisce "blu";
    case alpha: restituisce "alpha";
    }
    }

  • Negli indici, a causa del comportamento indefinito, è vietato l'uso dell'operazione “,” (“a[b,c]”). Il supporto per la maggior parte delle operazioni con variabili dichiarate con la parola chiave volatile è stato interrotto, comprese le operazioni “++” e “—” con tipi standard.
  • Ridotto il numero di situazioni in cui è richiesto "typename" per indicare la presenza di un tipo.

Fonte: opennet.ru

Aggiungi un commento