ISO odbor za standardizaciju jezika C++ međunarodni standard "". Predložene mogućnosti u specifikaciji, osim pojedinačnih slučajeva, u kompajlerima , i . Standardne biblioteke koje podržavaju C++20 implementirane su u okviru projekta .
U naredna dva meseca, odobrena specifikacija će biti u fazi pripreme dokumenta za objavljivanje, tokom koje će se obaviti ispravka pravopisnih grešaka i tipografskih grešaka. Na početku novembra, konačna verzija dokumenta biće poslana ISO-u na objavljivanje pod formalnim imenom ISO/IEC 14882:2020. U međuvremenu, odbor je već započeo rad na sledećem standardu C++23 (C++2b) i na sledećem virtuelnom sastanku razmotriće moguće .
():
- Dodane su "koncepti", proširenja šablona koja omogućavaju određivanje skupa zahteva za šablonskim parametrima, koji prilikom kompajliranja ograničavaju skup argumenata koji se mogu uzeti kao parametri šablona. Koncepti se mogu koristiti kako bi se izbegle logičke nedoslednosti između svojstava tipova podataka koji se koriste unutar šablona i svojstava tipova podataka ulaznih parametara.
template
concept EqualityComparable = requires(T a, T b) {
{ a == b } -> std::boolean;
{ a != b } -> std::boolean;
}; - U sastav su prihvaćeni za rad sa modulima, koji se mogu koristiti umesto zaglavlja. Moduli pružaju novi način organizacije izvornog koda na osnovu definicije granica komponenti, bez uključivanja zaglavlja putem "#include".
- Makar __VA_OPT__ za adaptivno otkrivanje variabilnih makroa u zavisnosti od prisutnosti tokena u variabilnom argumentu.
- Podrška za operator "" za trostrano poređenje.
- Podrška inicijalizatorima podrazumevanih elemenata za bitna polja.
- Mogućnost lambda hvatanja izraza "*this".
struct int_value {
int n = 0;
auto getter_fn() {
// BAD:
// return [=]() { return n; };// GOOD:
return [=, *this]() { return n; };
}
}; - Pozivanje elemenata putem pokazivača (Pointer-to-member), koristeći definisane putem izraza "const &" pokazivače na privremene objekte.
- Operator delete sa destruktorom, opisan u dokumentu .
- Klase imaju dopuštenje koristiti parametre šablona bez tipa.
struct foo {
foo() = default;
constexpr foo(int) {}
};template
auto get_foo() {
return f;
}get_foo(); // uses implicit constructor
get_foo(); - Neprehranjene lambda izraze s konstruktorom.
- Prihvatljivost korištenja sintakse predložaka za lambda izraze ("auto f = [](std::vector v)").
- Mogućnost korištenja string literala kao parametara predložaka.
- Podrška za C stil sintaksu inicijalizacije — polja koja nisu izričito navedena u inicijalizacijskom popisu se inicijaliziraju prema zadanim postavkama.
struct A {
int x;
int y;
int z = 123;
};A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2
- Podrška za prazne članove u strukturama podataka.
- Podrška za attributive likely i unlikely kako bi se optimizatoru pružila informacija o vjerojatnosti izvršavanja uvjetne konstrukcije ("[[likely]] if (random > 0) {").
- Mogućnost korištenja raspona za inicijalizaciju vrijednosti varijable u "for" petlji
for (auto v = std::vector{1, 2, 3}; auto& e : v) {
- Automatsko odredjivanje veličine niza u new ("new double[]{1,2,3}");
- Attribute "[[no_unique_address]]" prema kojem varijable bez podataka ne zauzimaju mjesto.
- Atomski pokazivači (std::atomic<shared_ptr> i std::atomic<weak_ptr>).
- Mogućnost pozivanja virtuelnih funkcija u uvjetnim izrazima.
- Podrška za brze (immediate) funkcije, koje mogu raditi samo s konstantama.
consteval int sqr(int n) {
return n * n;
}constexpr int r = sqr(100); // OK
int x = 100;
int r2 = sqr(x); // ERROR: 'x' se ne može koristiti kao konstanta - Mogućnost primjene constexpr s virtuelnim funkcijama ("constexpr virtual int f() const { return 2; }").
- U standardnoj biblioteci:
- Dodana podrška za tip char8_t za UTF-8 stringove.
- Dodani su zaglavlja bit (bitovne operacije) i version.
- Dodana je mogućnost provjere prefiksa i sufiksa stringova (starts_with, ends_with).
- Dodani su tipovi std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible i std::type_identity.
- Dodane su funkcije std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated i std::assume_aligned.
- U std::make_shared dodana je podrška za nizove.
- Dodana je funkcija std::to_array za pretvaranje objekata sličnih nizovima u std::array.
- Prikladnija sintaksa za nabrajanja:
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";
}
} - U indeksima je zabranjena upotreba operacije «,» («a[b,c]») zbog neodređenog ponašanja. Prekinuta je podrška za većinu operacija sa varijablama definiranim ključnom riječi volatile, uključujući zabranu operacija «++» i «—» s standardnim tipovima.
- Smanjen je broj situacija u kojima je potrebno navesti «typename» kako bi se informiralo o prisutnosti tipa.
Izvor: opennet.ru
