Výbor pre štandardizáciu jazyka ISO C++ schválil finálnu verziu špecifikácie, ktorá tvorí medzinárodný štandard „C++26“. Funkcie uvedené v špecifikácii sú už čiastočne podporované v kompilátoroch GCC, Clang a Microsoft Visual C++. Štandardné knižnice podporujúce C++26 boli implementované v rámci projektu Boost.
Počas nasledujúcich dvoch mesiacov prejde schválená špecifikácia fázou prípravy dokumentu, počas ktorej sa vykonajú redakčné opravy s cieľom odstrániť pravopisné chyby a preklepy. Začiatkom novembra bude finálna verzia dokumentu predložená ISO na publikovanie pod oficiálnym názvom ISO/IEC 14882:2026.
Kľúčové vlastnosti C++26:
- Boli implementované prvky programovania zmlúv (Zmluvy), ktoré umožňujú definovať formálne špecifikácie rozhrania pomocou troch nových operátorov: pre (predpodmienka), post (postpodmienka) a contract_assert (kontrola tvrdenia). Operátor „pre“ definuje predpoklady, ktoré musia byť splnené pred volaním (validácia vstupu); „post“ definuje podmienky, ktoré musia byť splnené po vykonaní (výstupné požiadavky); contract_assert definuje podmienky pre vyvolanie výnimiek. Táto funkcia bude dostupná v GCC 16. int f(const int x) pre (x != 1) // vstupné požiadavky post (r : r == x && r != 2) // požiadavky na výsledok; r je hodnota s výsledkom { contract_assert (x != 3); return x; }
- Bola pridaná podpora reflexie, ktorá umožňuje monitorovať a upravovať prvky programu počas kompilácie. Boli pridané nové operátory "^^" na získanie metainformácií o gramatickej konštrukcii a "[:…:]" na vykonanie inverznej transformácie. Na transformáciu a spracovanie informácií získaných počas inšpekcie je navrhnutá knižnica std::meta a k dispozícii sú aj možnosti výpočtov s konštantami. Podpora reflexie bude pridaná v GCC 16. constexpr int i = 42, j = 42; constexpr std::meta::info r = ^^i, s = ^^i; static_assert(r == r && r == s); static_assert(^^i != ^^j); // 'i' a 'j' majú rôzne hodnoty. static_assert(constant_of(^^i) == constant_of(^^j)); // 'i' a 'j' sú rovnaké static_assert(^^i != std::meta::reflect_constant(42)); // odlišná od hodnoty 42
- Pridaná „šablóna for“ na iterovanie cez prvky, ako sú balíky parametrov, objekty podobné n-ticiam a výsledky reflexie (metaobjekty) počas kompilácie v štýle bežnej slučky for. Pri vykonávaní „šablóny for“ sa telo slučky rozbalí pre každý prvok a každá iterácia sa spracuje v samostatnom rozsahu, v ktorom je premenná meníaca sa v slučke konštantná. V kontexte reflexie je možné „šablónu for“ použiť na iterovanie cez vlastnosti tried alebo enumov. Táto funkcia bude dostupná v GCC 16. void f() { template for (constexpr int I : std::array{1, 2, 3}) { static_assert(I < 4); } } sa rozbalí na: void f() { { constexpr auto&& __range = std::array{1, 2, 3}; constexpr auto __begin = __range.begin(); constexpr auto __expansion-size = __range.end() — __begin; // 3 { constexpr int I = *(__begin + 0); static_assert(I < 4); } { constexpr int I = *(__begin + 1); static_assert(I < 4); } { constexpr int I = *(__begin + 2); static_assert(I < 4); } } }
- Pridaný framework std::execution pre asynchrónne a paralelné vykonávanie kódu. Poskytuje objekty plánovača, ktoré definujú plánovač práce (vlákno, fond vlákien, GPU, slučka udalostí), objekty sender, ktoré definujú prácu, ktorá sa má vykonať, a objekty receiver, ktoré spracovávajú výsledok. using namespace std::execution; scheduler auto sch = thread_pool.scheduler(); sender auto begin = schedule(sch); sender auto hi = then(begin, []{ std::cout < "Ahoj svet! Mám celé číslo."; return 13; }); sender auto add_42 = then(hi, [](int arg) { return arg + 42; }); auto [i] = this_thread::sync_wait(add_42).value();
- Bola pridaná knižnica std::simd na paralelizáciu dátových operácií pomocou inštrukčných sád SIMD, ako sú AVX-512 a NEON, s použitím štandardného typového systému C++. a = {1.0f, 2.0f, 3.0f, 4.0f}; std::simd b = {5.0f, 6.0f, 7.0f, 8.0f}; výsledok std::simd = a + b;
- Navrhuje sa implementácia vektora (polja) s premennou veľkosťou std::inplace_vector. Je alokovaný na zásobníku, ktorého veľkosť je určená počas kompilácie. API je podobné ako std::vector, ale prvky poľa sú uložené interne, nie na halde. inplace_vector a(10); inplace_vector b(std::move(a)); assert(a.size() == 10);
- Bola pridaná direktíva „#embed“ na vkladanie binárnych zdrojov do kódu. const unsigned char icon_display_data[] = { #embed "art.png" };
- Pridaná podpora pre generovanie a spracovanie výnimiek počas kompilácie, keď sa v kontexte constexpr vyskytnú chyby. constexpr std::optional checked_divide(unsigned n, unsigned d) { try { return divide(n, d); } catch (...) { return std::nullopt; } } constexpr date parse_date(std::string_view input) { auto [correct, year, month, day] = ctre::match<“([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})”>(input); if (!correct) { throw incorrect_date{input}; } return build_date(year, month, day); }
- Dátová štruktúra std::hive bola implementovaná pre neusporiadané ukladanie dát a opätovné použitie pamäte uvoľnenej odstránenými prvkami. Štruktúra je optimalizovaná pre pracovné zaťaženia s vysoko intenzívnym pridávaním a odstraňovaním prvkov v ľubovoľnom poradí. Na rozdiel od polí, odstránenie prvku v std::hive neposunie ostatné prvky, ale skôr označí odstránený prvok ako prázdny a potom vyplní uvoľnenú pozíciu, keď sa pridá nový prvok.
- Pridaná knižnica std::linalg s API pre lineárnu algebru založeným na BLAS.
- Pridaná podpora pre mechanizmus synchronizácie ukazovateľov nebezpečenstva, ktorý zabraňuje uvoľneniu pamäte pre objekty, ku ktorým pristupujú iné vlákna bez uzamknutia. Keď je objekt odstránený, je označený iba ako odstránený, ale pamäť obsadená objektom sa uvoľní až po tom, čo všetky vlákna uvoľnia ukazovateľ nebezpečenstva nastavený počas prístupu k objektu.
- Pridaná podpora pre synchronizačný mechanizmus RCU (Read-Copy Update). Operácie zápisu vytvárajú novú inštanciu objektu, zatiaľ čo operácie čítania sa neblokujú, ale pokračujú v práci so starou inštanciou. Po dokončení zmeny sa nová inštancia stane aktívnou a vykonajú sa na nej nové operácie čítania, zatiaľ čo stará inštancia sa po dokončení čítania vlákien vymaže.
- Boli vykonané zmeny na posilnenie bezpečnosti štandardnej knižnice, ako napríklad kontrola platných hodnôt a pretečenia vyrovnávacej pamäte. Napríklad pri prístupe k elementu „constexpr reference operator[](size_type idx) const;“ bola pridaná kontrola podmienky „idx < size()“.
- Je k dispozícii možnosť použiť kľúčové slovo constexpr s variantom operátora new (umiestnenie new) na umiestnenie objektu do predalokovanej pamäte počas kompilácie.
- Pridaná podpora pre štruktúrované väzby v kontexte „constexpr“, čo znamená, že odkazy na konštantné výrazy môžu byť teraz samotné konštantné výrazy. Implementovaná je podpora pre polia a jednoduché štruktúry. constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Štruktúrované väzby teraz podporujú syntax "..." na určenie balíčkov, ktoré zachytávajú zostávajúci počet prvkov v priraďovacej sekvencii. auto [x,y,z] = f(); // premenné x, y, z budú obsahovať tri prvky vrátené funkciou f(). auto [...xs] = f(); // balíček xs bude obsahovať všetky prvky vrátené funkciou f(). auto [x, ...rest] = f(); // x bude obsahovať prvý prvok a rest bude obsahovať zvyšok. auto [x, y, ...rest] = f(); // x bude obsahovať prvý prvok, y bude obsahovať druhý a rest bude obsahovať tretí. auto [x, ...rest, z] = f(); // x bude obsahovať prvý, rest bude obsahovať druhý a z bude obsahovať tretí.
- Pridaná podpora pre „Triviálnu premiestniteľnosť“ typov, ktorá umožňuje optimalizovať presun objektov daného typu ich klonovaním v pamäti bez volania konštruktorov alebo deštruktorov. Pre triedy sú implementované vlastnosti memberwise_trivially_relocatable a memberwise_replaceable a pre nízkoúrovňový presun jedného alebo viacerých objektov sú pridané funkcie trivially_relocate_at a trivially_relocate.
- Bola implementovaná podpora pre pripojenie funkcie main() ku globálnemu modulu a definovanie funkcie main() v pomenovaných moduloch.
- Pridaný premenný operátor „priateľ“ („priateľ Ts...“).
- Implementované atribúty pre štruktúrované väzby;
- Pridaná syntax '= delete("reason")'.
- Základná sada znakov zahŕňa „@“, „$“ a „`“.
- Je k dispozícii možnosť použiť štruktúrované viazanie ako podmienku v príkazoch if a switch.
- Pridaná možnosť použitia viacerých zástupných premenných s názvom „_“ v jednom rozsahu; napríklad nasledujúce konštrukty sú teraz správne: struct S { int _, _; }; void func() { int _, _; } void other() { int _; // predtým sa v režime -Wunused zobrazovalo upozornenie }
- Možnosť používať reťazcové literály v kontextoch, kde sa nepoužívajú na inicializáciu poľa znakov a neobjavujú sa vo výslednom kóde, ale používajú sa iba počas kompilácie pre diagnostické správy a predspracovanie, napríklad ako parametre pre direktívy a atribúty _Pragma, asm, extern, static_assert, [[zastarané]] a [[nodiscard]].
- Pridané vstavané funkcie: „__builtin_is_within_lifetime“ na kontrolu, či je alternatíva aktívna v úniách a „__builtin_is_virtual_base_of“ na kontrolu, či je základná trieda virtuálna.
- Implementované triviálne nekonečné cykly bez nedefinovaného správania.
- Zabezpečené je zobrazenie chyby pri odstránení ukazovateľa na neúplný typ.
- Syntax na definovanie variadických parametrov s tromi bodkami bez predchádzajúcej čiarky (napríklad pri zadávaní „void e(int…)“ namiesto „void e(int, …)“) bola zastaraná.
- Použitie makier na deklarovanie modulov je zakázané.
- Implicitné konverzie vymenovaných hodnôt v aritmetických výpočtoch sú zastarané. int main() { enum E1 { e }; enum E2 { f }; bool b = e <= 3.7; // zastarané int k = f - e; // zastarané int x = +f - e; // OK }
- Podpora priameho porovnávania polí bola ukončená. int arr1[5]; int arr2[5]; bool same = arr1 == arr2;
- Trieda šablóny is_trivial bola zastaraná.
Zdroj: opennet.ru
