Comitato ISO per la standardizzazione del linguaggio C++ standard internazionale ««. Le funzionalità presentate nella specifica, ad eccezione di casi isolati, nei compilatori , e . Le librerie standard compatibili con C++20 sono implementate nell'ambito del progetto .
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 .
():
- 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 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 .
- È 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
