ISO комiteet je zaključil standardizacijo jezika C++ in potrdil končno različico specifikacije, ki oblikuje mednarodni standard „C++26“. Zmožnosti, predstavljene v specifikaciji, deloma že podpirajo prevajalniki GCC, Clang in Microsoft Visual C++. Standardne knjižnice, ki podpirajo C++26, so implementirane v okviru projekta Boost.
V naslednjih dveh mesecih bo potrjena specifikacija v fazi priprave dokumenta za objavo, kjer bo potekala uredniška obravnava pravopisnih napak in tiskovnih napak. Na začetku novembra bo končna različica dokumenta poslana ISO za objavo pod formalnim imenom ISO/IEC 14882:2026.
Glavne značilnosti C++26:
- Implementirani so elementi pogodbenega programiranja (Contracts), ki omogočajo določanje formalnih specifikacij vmesnikov s pomočjo treh novih operatorjev: pre (predpogoj), post (posledica) in contract_assert (preverjanje trditev). Operator „pre“ določa predpogoje, ki jih je treba izpolniti pred klicem (preverjanje vhodnih podatkov); „post“ - pogoje, ki jih je treba izpolniti po izvedbi (zahteve glede izhodnih podatkov); contract_assert - pogoje nastanka izjem. Možnost bo na voljo v GCC 16. int f(const int x) pre (x != 1) // zahteve glede vhodnih podatkov post (r : r == x && r != 2) // zahteve glede rezultata; r - vrednost z rezultatom { contract_assert (x != 3); return x; }
- Dodana je podpora za refleksijo (Reflection), ki omogoča spremljanje in spremembo elementov programa v fazi prevajanja. Dodani so novi operatorji „^^“ za pridobivanje meta informacij o slovnični konstrukciji in „[:…:]“ za izvajanje obratne transformacije. Za transformacijo in obdelavo informacij, pridobljenih med inšpekcijo, je bila predlagana knjižnica std::meta, ki omogoča takšne možnosti, kot so izračuni s konstantami. Podpora refleksiji bo dodana 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’ in ‘j’ imata različne vrednosti. static_assert(constant_of(^^i) == constant_of(^^j)); // ‘i’ in ‘j’ sta enaka static_assert(^^i != std::meta::reflect_constant(42)); // se razlikuje od vrednosti 42
- Dodana je operacija „template for“ za iteriranje kroz elemente, kao što su paketi parametara, objekti slični tuple-ima i rezultati refleksije (meta-objekti) u fazi kompilacije, u stilu obične petlje. Kada se izvršava „template for“, telo petlje se otkriva za svaki element, a svaka iteracija se obrađuje u odvojenom prostoru vidljivosti, gde je promenljiva koja se menja u petlji konstanta. U kontekstu refleksije, „template for“ se može koristiti za prolazak kroz svojstva klasa ili enumeracija. Mogućnost će se pojaviti u GCC 16. void f() { template for (constexpr int I : std::array{1, 2, 3}) { static_assert(I < 4); } } biće otkriveno u: 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); } } }
- Dodana je biblioteka std::execution za asinhrono i paralelno izvršavanje koda. Pruženi su objekti scheduler, koji definiše planirač izvršenja (tred, pool tredova, GPU, event loop), sender, koji definiše izvršeni posao, i receiver — obrada rezultata. using namespace std::execution; scheduler auto sch = thread_pool.scheduler(); sender auto begin = schedule(sch); sender auto hi = then(begin, []{ std::cout < "Hello world! Have an int."; return 13; }); sender auto add_42 = then(hi, [](int arg) { return arg + 42; }); auto [i] = this_thread::sync_wait(add_42).value();
- Dodana je biblioteka std::simd za paralelizaciju izvršavanja operacija nad podacima pomoću SIMD instrukcija, kao što su AVX-512 i NEON, koristeći standardni sistem tipova C++. std::simd a = {1.0f, 2.0f, 3.0f, 4.0f}; std::simd b = {5.0f, 6.0f, 7.0f, 8.0f}; std::simd result = a + b;
- Predložena je implementacija vektora (niza) promenljive veličine std::inplace_vector, smeštenog na steku, čija se veličina definiše u fazi kompilacije. API je sličan std::vector, ali elementi niza se ne čuvaju u „hrpi“, već unutar objekta. inplace_vector a(10); inplace_vector b(std::move(a)); assert(a.size() == 10);
- Dodata je direktiva „#embed“, namenjena za ugrađivanje u kod binarnih resursa. const unsigned char icon_display_data[] = { #embed "art.png" };
- Dodana je podrška za generisanje i obradu izuzetaka tokom kompajliranja u slučaju grešaka u kontekstu constexpr. 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(input); if (!correct) { throw incorrect_date{input}; } return build_date(year, month, day); }
- Implementirana je struktura podataka std::hive za neselektivno skladištenje podataka i obezbeđivanje ponovne upotrebe memorije koja je oslobodjena nakon brisanja elemenata. Struktura je optimizovana za opterećenja sa visokom učestalošću dodavanja i brisanja elemenata u proizvoljnom redosledu. Za razliku od nizova, brisanje elementa u std::hive ne izaziva pomeranje drugih elemenata, već označava obrisani element kao prazan, a oslobođeno mesto se popunjava prilikom dodavanja novog elementa.
- Dodana je biblioteka std::linalg sa API-jem za linearnu algebru, zasnovana na BLAS-u.
- Dodana je podrška za mehanizam sinhronizacije Hazard pointer, koji omogućava da se bez zaključavanja spreči oslobađanje memorije objekata s kojima se i dalje radi u drugim nitima. Prilikom brisanja objekta, on se samo označava kao obrisan, ali se memorija koju je objekat koristio oslobađa tek kada sve niti uklone hazard pokazivač koji se postavlja tokom rada s objektom.
- Dodana je podrška za mehanizam sinhronizacije RCU (Read-Copy Update) — prilikom operacija pisanja kreira se nova instanca objekta, dok operacije čitanja ostaju neblokirane i nastavljaju da rade sa starom instancom. Kada se promena završi, nova instanca postaje aktivna i nove operacije čitanja se već izvode sa njom, a stara instanca se briše nakon završetka čitanja iz njenih niti.
- Unete su izmene za jačanje sigurnosti standardne biblioteke, kao što su provere dozvoljenih vrednosti i izlaza van granica bafera. Na primer, pri pristupu elementu "constexpr reference operator[](size_type idx) const;" dodaje se provera uslova "idx < size()".
- Omogućena je upotreba ključne reči "constexpr" sa posebnim oblikom operatora "new" (placement new) za postavljanje objekta u unapred alociranu memoriju tokom kompajliranja.
- Dodana je podrška za strukturirane vezice (structured binding) u kontekstu „constexpr“, tj. reference na konstante može biti same konstante. Podrška je implementirana za nizove i jednostavne strukture. constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- U strukturirane vezice dodana je mogućnost korišćenja sintakse „…“ za označavanje paketa (pack), koji obuhvata preostali broj elemenata iz dodeljene sekvence. auto [x,y,z] = f(); // u promenljive x, y, z biće smeštene tri stavke koje vraća f(). auto […xs] = f(); // u paket xs biće smešteni svi elementi koje vraća f(). auto [x, …rest] = f(); // U x će biti smešten prvi element, a u rest — ostali. auto [x, y, …rest] = f(); // U x će biti smešten prvi element, u y — drugi, a u rest — treći. auto [x, …rest, z] = f(); // u x — prvi, u rest — drugi, u z — treći.
- Dodana je podrška za „trivijalnu premestivost“ tipova (Trivial Relocatability), koja omogućava optimizaciju premeštanja objekata datog tipa putem njihovog kloniranja u memoriji bez pozivanja konstruktora ili destruktora. Za klase su implementirane osobine memberwise_trivially_relocatable i memberwise_replaceable, a za niskonivo premestanje jednog ili više objekata dodate su funkcije trivially_relocate_at i trivially_relocate.
- Implementirana je podrška za vezivanje funkcije main() sa globalnim modulom i definisanje funkcije main() u imenovanim modulima.
- Dodana je varijabilna operacija „friend“ („friend Ts…“).
- Implementirane su atribute za strukturirane vezice;
- Dodana je sintaksa ‘= delete(„uzrok“)’.
- U osnovni skup simbola uključeni su „@“, „$“ i „`“.
- Omogućena je upotreba strukturiranog povezivanja (structured binding) kao uslova u operatorima if i switch.
- Dodana je mogućnost korišćenja više promenljivih-zamenika sa imenom „_“ u jednom opsegu vidljivosti, na primer, sada su korektne konstrukcije: struct S { int _, _; }; void func() { int _, _; } void other() { int _; // prethodno se prikazivalo upozorenje u režimu -Wunused }
- Dodana je možnost korišćenja literalnih stringova u kontekstu u kojem se ne koriste za inicijalizaciju niza karaktera i ne ulaze u rezultat, već se primenjuju samo tokom kompajliranja za dijagnostičke poruke i preprocesiranje, na primer, kao parametri direktiva i atributa _Pragma, asm, extern, static_assert, [[deprecated]] i [[nodiscard]].
- Dodate su ugrađene funkcije: "__builtin_is_within_lifetime" za proveru aktivnosti alternativnog tipa u unijama (union) i "__builtin_is_virtual_base_of" za proveru da li je osnovna klasa virtuelna.
- Implementirani su trivijalni beskonačni ciklusi bez neodređenog ponašanja.
- Obezbeđen je izlaz greške prilikom uklanjanja pokazivača na nepotpun tip.
- Razglašena je zastarela sintaksa za določitev variabilnih parametrov z trojno piko brez predhodne vejice (na primer, ko je navedeno «void e(int…)» namesto «void e(int, …)»).
- Zabranjena uporaba makrov za razglasitev modulov.
- Prevedeno je u kategoriju zastare obavljanje implicitnih konverzija enumerisanih vrednosti u aritmetičkim izrazima. int main() { enum E1 { e }; enum E2 { f }; bool b = e <= 3.7; // zastarelo int k = f - e; // zastarelo int x = +f - e; // OK }
- Prekinuta je podrška za direktno poređenje nizova. int arr1[5]; int arr2[5]; bool same = arr1 == arr2;
- Razglašena je zastarela templatska klasa is_trivial.
Izvor: opennet.ru
