Odobren standard C++26

ISO komisija za standardizaciju jezika C++ završila je finalizaciju specifikacije koja čini međunarodni standard "C++26". Mogućnosti predstavljene u specifikaciji djelomično su već podržane u kompajlerima GCC, Clang i Microsoft Visual C++. Standardne biblioteke koje podržavaju C++26 implementirane su u okviru projekta Boost.

U naredna dva mjeseca odobrena specifikacija bit će u fazi pripreme dokumenta za objavu, tijekom koje će se provesti rad na lekturi pravopisnih grešaka i tipfelera. Početkom novembra konačna verzija dokumenta bit će poslana ISO-u na objavu pod formalnim imenom ISO/IEC 14882:2026.

Glavne karakteristike C++26:

  • Implementirani su elementi ugovornog programiranja (Contracts), koji omogućuju definiranje formalnih specifikacija sučelja putem tri nove operatora: pre (pretpostavka), post (nakon uvjeta) i contract_assert (provjera tvrdnje). Operator „pre“ definira pretpostavke koje moraju biti ispunjene prije poziva (provjera ulaznih podataka); „post“ — uvjeti koji moraju biti zadovoljeni nakon izvršenja (zahtjevi za izlazne podatke); contract_assert — uvjeti koji izazivaju iznimke. Ova mogućnost bit će dostupna u GCC 16. int f(const int x) pre (x != 1) // zahtjevi za ulazne podatke post (r : r == x && r != 2) // zahtjevi za rezultat; r — vrijednost rezultata { contract_assert (x != 3); return x; }
  • Dodana je podrška za refleksiju (Reflection), koja omogućuje praćenje i modificiranje elemenata programa u fazi kompilacije. Dodani su novi operatori „^^“ za dobijanje metainformacija o gramatičkoj konstrukciji i „[:…:]“ za izvođenje obrnute konverzije. Za konverziju i obradu informacija dobijenih tijekom inspekcije predložena je biblioteka std::meta i dostupne su takve mogućnosti kao što su izračuni s konstantama. Podrška za refleksiju bit će dodana u 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’ i ‘j’ imaju različite vrijednosti. static_assert(constant_of(^^i) == constant_of(^^j)); // ‘i’ i ‘j’ su jednaki static_assert(^^i != std::meta::reflect_constant(42)); // različito od vrijednosti 42
  • Dodana je operator "template for" za prolazak kroz elemente, poput paketa parametara, objekata sličnih tuple-ima i rezultata refleksije (metaobjekata), u fazi kompilacije u stilu obične petlje. Kada se izvršava "template for", telo petlje se otkriva za svaki element i svaka iteracija se obrađuje u zasebnoj oblasti vidljivosti, gde je promenljiva u petlji konstantna. U kontekstu refleksije "template for" može se koristiti za prolazak kroz svojstva klasa ili enumeracija. Mogućnost će biti dostupna 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žaju se objekti scheduler, koji definiše planifiera izvršenja (nit, okvir niti, GPU, događajni petlja), 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šenja operacija nad podacima koristeći SIMD instrukcijske setove, poput 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, koji se smešta na stek, čija se veličina definiše tokom kompilacije. API je sličan std::vector, ali se elementi niza ne čuvaju u "hrpi", već unutar objekta. inplace_vector a(10); inplace_vector b(std::move(a)); assert(a.size() == 10);
  • Dodana je direktiva "#embed", namenjena za ugradnju binarnih resursa u kod. const unsigned char icon_display_data[] = { #embed "art.png" };
  • Dodana je podrška za generiranje i obradu iznimaka tijekom kompilacije 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 neuređeno pohranjivanje podataka i omogućavanje ponovne upotrebe memorije koja je oslobođena nakon uklonjenih elemenata. Struktura je optimizirana za opterećenja s visokom intenzitetom dodavanja i uklanjanja elemenata u proizvoljnom redoslijedu. Za razliku od nizova, uklanjanje elementa u std::hive ne uzrokuje pomicanje ostalih elemenata, nego označava uklonjeni element kao praznu poziciju kojoj se može dodati novi element.
  • Dodana je biblioteka std::linalg s API-jem za linearnu algebru, koja se temelji na BLAS-u.
  • Dodana je podrška za mehanizam sinkronizacije Hazard pointer, koji omogućava sprječavanje oslobađanja memorije objekata s kojima se nastavlja raditi u drugim nitima bez postavljanja zaključavanja. Pri uklanjanju objekta, on se samo označava kao uklonjen, a memorija koju je zauzimao oslobađa se tek kada sve niti skinu hazard pokazivač postavljen tijekom rada s objektom.
  • Dodana je podrška za mehanizam sinkronizacije RCU (Read-Copy Update) — prilikom operacija pisanja stvara se nova instanca objekta, dok se operacije čitanja ne blokiraju, već nastavljaju raditi sa starom instancom. Nakon završetka promjena, nova instanca postaje aktivna i nove operacije čitanja već se obavljaju s njom, a stara instanca se uklanja nakon što sve niti koje je čitaju završe.
  • Unesene su promjene za poboljšanje sigurnosti standardne biblioteke, poput provjera dopuštenih vrijednosti i izlaza iz granica bafera. Na primjer, prilikom pristupa elementu «constexpr reference operator[](size_type idx) const;» dodaje se provjera uvjeta «idx < size()».
  • Omogućeno je korištenje ključne riječi «constexpr» s varijantom operatora «new» (placement new) za smještaj objekta u unaprijed dodijeljenu memoriju tijekom kompilacije.
  • Dodana je podrška za strukturirani binding u kontekstu «constexpr», tj. reference na konstantne izraze sada mogu biti sama konstantna izraza. Podrška je implementirana za nizove i jednostavne strukture. constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
  • U strukturirane bindove dodana je mogućnost korištenja sintakse «…» za označavanje paketa koji hvata preostali broj elemenata iz dodijeljene sekvencije. auto [x,y,z] = f(); // u varijable x, y, z bit će upisana tri elementa koja vraća f(). auto […xs] = f(); // u paket xs bit će upisani svi elementi koje vraća f(). auto [x, …rest] = f(); // U x će biti upisan prvi element, a u rest — ostali. auto [x, y, …rest] = f(); // U x će biti upisan 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 «trivialnu premjestivost» tipova, što omogućuje optimizaciju premještanja objekata određenog tipa kroz njihovo kloniranje u memoriji bez pozivanja konstruktora ili destruktora. Za klase su implementirane osobine memberwise_trivially_relocatable i memberwise_replaceable, a za niskonivojno premještanje jednog ili više objekata dodane su funkcije trivially_relocate_at i trivially_relocate.
  • Implementirana je podrška za povezivanje funkcije main() s globalnim modulom i definiranje funkcije main() u nazivnim modulima.
  • Dodana je varijabilna oznaka «friend» («friend Ts…»).
  • Implementirani su atributi za strukturirane bindove;
  • Dodana je sintaksa ‘= delete(«razlog»)’.
  • U osnovni skup simbola uključeni su «@», «$» i «`».
  • Omogućena je primjena strukturiranog povezivanja kao uvjeta u if i switch operatorima.
  • Dodana je mogućnost korištenja više varijabli-čistača s imenom «_» u jednom području vidljivosti, na primjer, sada su ispravne konstrukcije: struct S { int _, _; }; void func() { int _, _; } void other() { int _; // ranije se ispisivala upozorenje u načinu -Wunused }
  • Omogućena je upotreba string literala u kontekstu u kojem se ne koriste za inicijalizaciju niza karaktera i ne ulaze u rezultantni kod, već se koriste samo tokom kompilacije za dijagnostičke poruke i preprocesiranje, na primer, kao parametri direktiva i atributa _Pragma, asm, extern, static_assert, [[deprecated]] i [[nodiscard]].
  • Dodane su ugrađene funkcije: „__builtin_is_within_lifetime“ za proveru aktivnog alternativnog tipa u unijama (union) i „__builtin_is_virtual_base_of“ za proveru da li je osnovni klasa virtualna.
  • Implementirani su trivijalni beskonačni ciklusi bez neodređenog ponašanja.
  • Obezbeđen je ispis greške prilikom uklanjanja pokazivača na nekompletan tip.
  • Proglasan je zastarelo sintaktičko određivanje variativnih parametara sa množenjem bez prethodne zapete (na primer, kada se navodi „void e(int…)“ umesto „void e(int, …)“).
  • Zabranjena upotreba makroa za definisanje modula.
  • Prevedeno je u kategoriju zastare izvršavanje implicitnih konverzija enumerisanih vrednosti u aritmetičkim računanjima. int main() { enum E1 { e }; enum E2 { f }; bool b = e <= 3.7; // zastarjelo int k = f - e; // zastarjelo int x = +f - e; // OK }
  • Prekinuta je podrška za direktno poređenje nizova. int arr1[5]; int arr2[5]; bool same = arr1 == arr2;
  • Proglasan je zastarelo šablonski klasa is_trivial.

    Izvor: opennet.ru
Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster