Approvato lo standard C++20

Comitato di standardizzazione ISO C++ approvato standard internazionale "C ++ 20"Le capacità presentate nella specifica, ad eccezione di casi isolati, поддерживаются 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, la specifica approvata sarà in fase di preparazione del documento, dove verrà svolto un lavoro editoriale per correggere errori di ortografia e refusi. All'inizio di novembre, la versione finale del documento sarà sottoposta 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à possibili miglioramenti nella prossima riunione virtuale. innovazioni.

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

  • Sono stati aggiunti i "Concetti", estensioni del template che consentono di definire un insieme di requisiti per i parametri del template che, in fase di compilazione, vincolano l'insieme di argomenti accettabili come parametri del template. I concetti possono essere utilizzati per evitare incongruenze logiche tra le proprietà dei tipi di dati utilizzati all'interno di un template e le proprietà dei tipi di dati dei parametri di input.

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

  • Sono stati ammessi alla composizione: espansione Per lavorare con i moduli, che possono essere utilizzati al posto dei file di intestazione. I moduli offrono un nuovo modo di organizzare il codice sorgente basato sulla definizione dei limiti dei componenti, senza la necessità di includere i file di intestazione tramite "#include".
  • Macro __VA_OPT__ per l'espansione adattiva delle macro variadiche in base alla presenza di token nell'argomento variadico.
  • Supporto per l'operatore "" per il confronto a tre vie.
  • Supporto per inizializzatori di elementi predefiniti per i campi bit.
  • Possibilità di cattura lambda delle espressioni "*this".

    struct int_value {
    intn = 0;
    auto getter_fn() {
    // CATTIVO:
    // restituisci [=]() { restituisci n; };

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

  • Accesso puntatore-membro mediante puntatori a oggetti temporanei definiti tramite l'espressione "const &".
  • L'operatore di eliminazione con un distruttore descritto nel documento P0722R1.
  • Le classi possono utilizzare parametri modello senza tipo.

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

    modello
    auto get_foo() {
    ritorno f;
    }

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

  • Espressioni lambda non persistenti con costruttore.
  • Consentito l'utilizzo della sintassi del modello per le espressioni lambda ('auto f = [] (std::vettore v)»).
  • Possibilità di utilizzare stringhe letterali nei parametri del modello.
  • Supporto per la sintassi di inizializzazione in stile C: i campi non elencati esplicitamente 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 i membri vuoti delle strutture dati.
  • Supporto per gli attributi probabile e improbabile per informare l'ottimizzatore sulla probabilità che venga attivato un costrutto condizionale ("[[probabile]] se (casuale > 0) {").
  • Possibilità di utilizzare intervalli per inizializzare i valori delle variabili in un ciclo for

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

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

    const int sqr(int n) {
    restituisci 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 supporto per il tipo char8_t per stringhe UTF-8.
    • Aggiunti i file di intestazione bit (operazioni bit) e versione.
    • Ora è possibile controllare il prefisso e il suffisso delle stringhe (starts_with, ends_with).
    • Aggiunti i tratti 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.
    • Aggiunto il supporto per gli array a std::make_shared.
    • Aggiunta la funzione std::to_array per convertire oggetti di tipo array in std::array.
  • Una sintassi più comoda per le enumerazioni:

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

    std::string_view to_string(rgba_color_channel my_channel) {
    cambia (mio_canale) {
    utilizzando l'enumerazione rgba_color_channel;
    caso rosso: restituisce "rosso";
    caso verde: restituisce "verde";
    caso blu: restituisce "blu";
    caso alfa: restituisce "alfa";
    }
    }

  • L'operatore "," ("a[b,c]") non è più consentito negli indici a causa di un comportamento indefinito. La maggior parte delle operazioni sulle variabili dichiarate con la parola chiave volatile non sono più supportate, inclusi gli operatori "++" e "—" sui tipi standard.
  • Ridotto il numero di situazioni in cui è necessario specificare "typename" per indicare la presenza di un tipo.

Fonte: opennet.ru

Aggiungi un commento