Comitato di standardizzazione ISO C++ standard internazionale ""Le capacità presentate nella specifica, ad eccezione di casi isolati, nei compilatori , и Le librerie standard che supportano C++20 sono implementate all'interno del progetto .
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. .
():
- 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: 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 .
- 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
