ISO komitét pre standardizáciu jazyka C++ medzinárodný štandard „“. Z možnosti uvedené v špecifikácii, s výnimkou jednotlivých prípadov, v kompilátoroch , a . Podporujúce C++20 štandardné knižnice sú realizované v rámci projektu .
V nasledujúcich dvoch mesiacoch bude schválená špecifikácia vo fáze prípravy dokumentu na publikáciu, kde sa uskutoční práca na redakčných úpravách pravopisných chýb a preklepov. Na začiatku novembra bude výsledná verzia dokumentu zaslaná ISO na publikáciu pod formálnym názvom ISO/IEC 14882:2020. Medzitým už komitét začal pracovať na nasledujúcom štandarde C++23 (C++2b) a na najbližšom virtuálnom zasadnutí preskúma možné .
():
- Boli pridané „koncepty“, rozšírenia šablón, ktoré umožňujú definovať súbor požiadaviek na parametre šablóny, ktoré počas kompilácie obmedzujú súbor argumentov, ktoré môžu byť prijaté ako parametre šablóny. Koncepty sa dajú aplikovať na to, aby sa predišlo logickým nezrovnalostiam medzi vlastnosťami typov údajov používaných vo vnútri šablóny a vlastnosťami typov údajov vstupných parametrov.
template
concept EqualityComparable = requires(T a, T b) {
{ a == b } -> std::boolean;
{ a != b } -> std::boolean;
}; - Do súboru prijatých na prácu s modulmi, ktoré je možné použiť namiesto hlavičkových súborov. Moduly poskytujú nový spôsob organizácie zdrojových kódov na základe definovania hraníc komponentov, bez zahrnutia hlavičkových súborov prostredníctvom „#include“.
- Makro __VA_OPT__ na adaptívne rozširovanie variabilných makier v závislosti od prítomnosti tokenov vo variabilnom argumente.
- Podpora operátora „“ na trojstranné porovnávanie.
- Podpora inicializátorov prvkov s predvolenými hodnotami pre bitové polia.
- Možnosť lambda zachytávať výrazy „*this“.
struct int_value {
int n = 0;
auto getter_fn() {
// BAD:
// return [=]() { return n; };// GOOD:
return [=, *this]() { return n; };
}
}; - Volanie prvkov podľa ukazovateľa (Pointer-to-member), použitie definovaných cez výraz „const &“ ukazovateľov na dočasné objekty.
- Operátor delete s destruktorom popísaným v dokumente .
- Triedam je povolené používať parametre šablóny bez typu.
struct foo {
foo() = default;
constexpr foo(int) {}
};template
auto get_foo() {
return f;
}get_foo(); // používa implicitný konštruktor
get_foo(); - Nepodporované lambda výrazy s konštruktorom.
- Povolenie použitia syntaxe šablón pre lambda výrazy ("auto f = [](std::vector v)").
- Možnosť používania reťazcových literálov v parametroch šablóny.
- Podpora syntaxe inicializácie v štýle C — explicitne nenazvané v zozname inicializácie sa inicializujú predvolene.
struct A {
int x;
int y;
int z = 123;
};A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2
- Podpora prázdnych členov dátových štruktúr.
- Podpora atribútov likely a unlikely na informovanie optimalizátora o pravdepodobnosti vyhodnotenia podmienej konštrukcie ("[[likely]] if (random > 0) {").
- Možnosť používania rozsahov na inicializáciu hodnôt premenných v cykle "for"
for (auto v = std::vector{1, 2, 3}; auto& e : v) {
- Automatické vypočítanie veľkosti poľa pri new ("new double[]{1,2,3}");
- Atribút "[[no_unique_address]]" znamená, že premenné bez údajov nezaberajú miesto.
- Atomické ukazovatele (std::atomic<shared_ptr> a std::atomic<weak_ptr>).
- Možnosť volania virtuálnych funkcií v podmienečných výrazoch.
- Podpora okamžitých funkcií, ktoré môžu pracovať iba s konštantami.
consteval int sqr(int n) {
return n * n;
}constexpr int r = sqr(100); // OK
int x = 100;
int r2 = sqr(x); // CHYBA: ‘x’ nemôže byť použitá ako konštanta - Možnosť použitia constexpr s virtuálnymi funkciami ("constexpr virtual int f() const { return 2; }").
- Vo štandardnej knižnici:
- Pridaná podpora typu char8_t pre reťazce UTF-8.
- Pridané hlavičkové súbory bit (bitové operácie) a version.
- Pridala sa možnosť kontroly prefixu a sufixu reťazcov (starts_with, ends_with).
- Pridané typáže std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible a std::type_identity.
- Pridané funkcie std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated a std::assume_aligned.
- Vo std::make_shared bola pridaná podpora polí.
- Pridaná funkcia std::to_array na konverziu podobných na pole objektov do std::array.
- Priateľskejšia syntax enumerácií:
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";
}
} - V indexoch je zakázané používať operáciu „,“ („a[b,c]“) z dôvodu nejasného správania. Podpora väčšiny operácií s premennými vyhlásenými pomocou kľúčového slova volatile bola zrušená, vrátane operácií „++“ a „—“ so štandardnými typmi.
- Počet situácií, v ktorých je potrebné uviesť „typename“ na informovanie o prítomnosti typu, bol znížený.
Zdroj: opennet.ru
