Komiteti ISO për standardizimin e gjuhës C++ përfundoi miratimin e versionit përfundimtar të specifikimeve që formojnë standardin ndërkombëtar "C++26". Mundësitë e paraqitura në specifikim pjesërisht janë mbështetur tashmë në kompilerët GCC, Clang dhe Microsoft Visual C++. Bibliotekat standarde që mbështesin C++26 janë implementuar në kuadër të projektit Boost.
Në dy muajt e ardhshëm, specifikimi i miratuar do të jetë në fazën e përgatitjes së dokumentit për publikim, ku do të kryhet punë për redaktimin e gabimeve ortografike dhe shtypore. Në fillim të nëntorit, varianti përfundimtar i dokumentit do të dërgohet në ISO për publikim me emrin e formalizuar ISO/IEC 14882:2026.
Karakteristikat kryesore të C++26:
- JanĂ« implementuar elementet e programimit kontraktual (Contracts), qĂ« lejojnĂ« pĂ«rcaktimin e specifikimeve formale tĂ« ndĂ«rfaqeve me ndihmĂ«n e tre operatorĂ«ve tĂ« rinj: pre (kusht paraprak), post (kusht pas) dhe contract_assert (kontrolli i pretencĂ«s). OperatorĂ«t "pre" pĂ«rcakton kushtet paraprake qĂ« duhet tĂ« plotĂ«sohen para thirrjes (kontrolli i tĂ« dhĂ«nave hyrĂ«se); "post" â kushtet qĂ« duhet tĂ« respektohen pas ekzekutimit (kĂ«rkesat pĂ«r tĂ« dhĂ«nat dalĂ«se); contract_assert â kushtet pĂ«r ndodhitĂ« pĂ«rjashtuese. Kjo mundĂ«si do tĂ« jetĂ« e disponueshme nĂ« GCC 16. int f(const int x) pre (x != 1) // kĂ«rkesat pĂ«r tĂ« dhĂ«nat hyrĂ«se post (r : r == x && r != 2) // kĂ«rkesat pĂ«r rezultatin; r â vlera me rezultatin { contract_assert (x != 3); return x; }
- ĂshtĂ« shtuar mbĂ«shtetje pĂ«r refleksionin (Reflection), qĂ« lejon gjurmimin dhe modifikimin e elementeve tĂ« programit nĂ« fazĂ«n e pĂ«rpunimit. JanĂ« shtuar operatorĂ«t e rinj "^^" pĂ«r marrjen e meta-informacionit nĂ« lidhje me konstrukcionet gramatikore dhe "[:âŠ:]" pĂ«r tĂ« kryer transformimin pĂ«r ndryshe. PĂ«r transformimin dhe pĂ«rpunimin e informacionit tĂ« marrĂ« gjatĂ« inspektimit, Ă«shtĂ« propozuar biblioteca std::meta dhe janĂ« tĂ« disponueshme mundĂ«si si llogaritjet me konstantet. MbĂ«shtetje pĂ«r refleksionin do tĂ« shtohet nĂ« 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' dhe 'j' kanĂ« vlera tĂ« ndryshme. static_assert(constant_of(^^i) == constant_of(^^j)); // 'i' dhe 'j' janĂ« tĂ« njĂ«jtĂ« static_assert(^^i != std::meta::reflect_constant(42)); // ndryshe nga vlera 42
- ĂshtĂ« shtuar operatori "template for" pĂ«r tĂ« iteruar elemente si paketat e parametrave, objekte tĂ« ngjashme me tuple dhe rezultatet e reflektimit (metaobjekte) nĂ« fazĂ«n e kompilimit nĂ« stilin e njĂ« cikli tĂ« zakonshĂ«m. Kur "template for" ekzekutohet, trupi i ciklit zgjerohet pĂ«r çdo element dhe çdo iterim pĂ«rpunoohet nĂ« njĂ« hapĂ«sirĂ« tĂ« veçantĂ«, ku variabla e ndryshueshme nĂ« cikĂ«l Ă«shtĂ« njĂ« konstantĂ«. NĂ« kontekstin e reflektimit, "template for" mund tĂ« pĂ«rdoret pĂ«r tĂ« lĂ«vizur nĂ«pĂ«r pronat e klasave ose enumeracioneve. MundĂ«sia do tĂ« shfaqet nĂ« GCC 16. void f() { template for (constexpr int I : std::array{1, 2, 3}) { static_assert(I < 4); } } do tĂ« zgjerohet nĂ«: 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); } } }
- ĂshtĂ« shtuar framework-u std::execution pĂ«r ekzekutimin asinkron dhe paralel tĂ« kodit. Ofrohen objekte scheduler, qĂ« pĂ«rcakton planifikuesin e kryerjes (njĂ« thread, grup threads, GPU, event loop), sender, qĂ« pĂ«rcakton punĂ«n pĂ«r t'u kryer, dhe receiver - trajtuesin e rezultatit. 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();
- ĂshtĂ« shtuar biblioteka std::simd pĂ«r tĂ« paralelizuar ekzekutimin e operacioneve mbi tĂ« dhĂ«nat duke pĂ«rdorur grupe instrukcionesh SIMD, si AVX-512 dhe NEON, duke pĂ«rdorur sistemin standard tĂ« tipeve 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;
- ĂshtĂ« propozuar njĂ« implementim i vektorit (arrĂ«) me madhĂ«si tĂ« ndryshueshme std::inplace_vector, qĂ« vendoset nĂ« stack, madhĂ«sia e tĂ« cilit pĂ«rcaktohet nĂ« fazĂ«n e kompilimit. API Ă«shtĂ« e ngjashme me std::vector, por elementĂ«t e arrĂ«s ruhen jo nĂ« "heap", por brenda objektit. inplace_vector a(10); inplace_vector b(std::move(a)); assert(a.size() == 10);
- ĂshtĂ« shtuar direktyva "#embed", e destinuar pĂ«r tĂ« inkorporuar nĂ« kod burimet binarĂ«. const unsigned char icon_display_data[] = { #embed "art.png" };
- ShtatĂ« pranuar mbĂ«shtetje pĂ«r gjenerimin dhe pĂ«rpunimin e pĂ«rjashtimeve nĂ« fazĂ«n e pĂ«rpunimit kur ka gabime nĂ« kontekstin constexpr. constexpr std::optional checked_divide(unsigned n, unsigned d) { provoni { ktheni ndarjen(n, d); } kapni (âŠ) { ktheni std::nullopt; } } constexpr date parse_date(std::string_view input) { auto [correct, year, month, day] = ctre::match(input); se nuk Ă«shtĂ« e saktĂ«) { hedhni incorrect_date{input}; } ktheni build_date(year, month, day); }
- Implementuar struktura të dhënash std::hive për ruajtjen e pandodhur të të dhënave dhe për të siguruar ripërdorimin e memories të lëshuar nga elementët e fshirë. Strukturë e optimizuar për ngarkesa me intensitet të lartë në shtimin dhe fshirjen e elementëve në rend të rastësishëm. Ndryshe nga tabelat, fshirja e një elementi në std::hive nuk përfshin zhvendosjen e elementëve të tjerë, por rezulton në shënimin e elementit të fshirë si të zbrazët, me mbushjen e pozites të lëshuar pas shtimit të një elementi të ri.
- Shtuar biblioteka std::linalg me API për algebra të linjare, e bazuar në BLAS.
- Shtuar mbështetje për mekanizmin e sinkronizimit Hazard pointer, duke lejuar që pa vendosjen e bllokimeve të parandalojë lëshimin e memories së objekteve me të cilat vazhdohet puna në thjeshtësi të tjera. Kur një objekt fshihet, ai thjesht shënohet si të fshirë, por memoria e mbajtur nga objekti lëshohet vetëm kur të gjitha thjeshtësitë largojnë hazard-pointerin, i vendosur gjatë punës me objektin.
- Shtuar mbështetje për mekanizmin e sinkronizimit RCU (Read-Copy Update) - në operacionet e shkrimit krijohet një ekzemplar i ri i objektit, ndërsa operacionet e leximit nuk bllokohen, por vazhdojnë të punojnë me ekzemplarin e vjetër. Pas përfundimit të ndryshimit, ekzemplari i ri bëhet aktiv dhe operacionet e reja të leximit kryhen tashmë me të, ndërsa ekzemplari i vjetër fshihet pas përfundimit të thjeshtësive që e lexojnë atë.
- Kryer ndryshime për të forcuar sigurinë e bibliotekës standarde, të tilla si kontrollet e vlerave të pranueshme dhe daljes nga kufiri i tamponëve. Për shembull, kur qasje në elementin «constexpr reference operator[](size_type idx) const;» shtohet një kontroll i kushtit «idx < size()".
- Siguruar mundësinë e përdorimit të fjalës kyçe «constexpr» me një lloj operatori «new» (placement new) për vendosjen e objektit në memorie të caktuar më përpara gjatë përpunimit.
- Shtesa e mbështetjes për lidhjet e strukturuara (structured binding) në kontekstin e "constexpr", pra, referencat në shprehjet konstante tani mund të jenë vetë shprehje konstante. Mbështetja është implementuar për arrays dhe struktura të thjeshta. constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- NĂ« lidhjet e strukturuara Ă«shtĂ« shtuar mundĂ«sia e pĂ«rdorimit tĂ« sintaksĂ«s «âŠÂ» pĂ«r tĂ« pĂ«rmendur paketat (pack), duke kapur numrin e mbetur tĂ« elementeve nga sekuenca e caktuar. auto [x,y,z] = f(); // nĂ« variablat x, y, z do tĂ« ruajnĂ« tre elementĂ«t e kthyera nga f(). auto [âŠxs] = f(); // nĂ« paketĂ«n xs do tĂ« ruhen tĂ« gjithĂ« elementĂ«t e kthyera nga f(). auto [x, âŠrest] = f(); // NĂ« x do tĂ« ruhet elementi i parĂ«, ndĂ«rsa nĂ« rest â elementĂ«t e tjerĂ«. auto [x, y, âŠrest] = f(); // NĂ« x do tĂ« ruhet elementi i parĂ«, nĂ« y â i dyti, ndĂ«rsa nĂ« rest â i treti. auto [x, âŠrest, z] = f(); // nĂ« x â i pari, nĂ« rest â i dyti, nĂ« z â i treti.
- Shtesa e mbështetjes për "zhvendosjen triviale" të tipave (Trivial Relocatability), e cila lejon optimizimin e zhvendosjeve të objekteve të caktuar përmes kopjimit të tyre në memorie pa thirrjen e konstruktorëve ose shkatërruesve. Për klasa janë implementuar pronat memberwise_trivially_relocatable dhe memberwise_replaceable, dhe për zhvendosjen e ulët të një ose më shumë objekteve janë shtuar funksionet trivially_relocate_at dhe trivially_relocate.
- ĂshtĂ« realizuar mbĂ«shtetje pĂ«r tĂ« lidhur funksionin main() me modul global dhe pĂ«r tĂ« pĂ«rkufizuar funksionin main() nĂ« modulet e emĂ«ruara.
- Shtimi i operatorit variativ "friend" ("friend TsâŠ").
- Janë realizuar atributet për lidhjet e strukturuara;
- Shtimi i sintaksĂ«s â= delete(«arsye»)â.
- Në setin bazë të simboleve janë përfshirë "@", "$" dhe "`".
- Sigurohet mundësia e aplikimit të lidhjeve të strukturuara (structured binding) si kusht në operatorët if dhe switch.
- Shtogu i mundësinë e përdorimit të disa variablave mbushës me emrin «_» në një hapësirë të vetme, për shembull, tani janë konstrukte të vlefshme: struct S { int _, _; }; void func() { int _, _; } void other() { int _; // më parë shfaqej një paralajmërim në modin -Wunused }
- Ăsht e mundur pĂ«rdorimi i literalĂ«ve tĂ« vargjeve nĂ« njĂ« kontekst ku ato nuk pĂ«rdoren pĂ«r inicializimin e njĂ« array karakteresh dhe nuk bien nĂ« kodin rezultues, por pĂ«rdoren vetĂ«m gjatĂ« kompilimit pĂ«r mesazhe diagnostikuese dhe parapĂ«rpunim, pĂ«r shembull, si parametro tĂ« drejtpĂ«rdrejta dhe atributeve _Pragma, asm, extern, static_assert, [[deprecated]] dhe [[nodiscard]].
- Janë shtuar funksione të integruara: «__builtin_is_within_lifetime» për të kontrolluar aktivitetin e alternativës në unione (union) dhe «__builtin_is_virtual_base_of» për të kontrolluar nëse klasa bazë është virtuale.
- Kryerja e cikleve triviale infinite pa sjellje të paqartë.
- Siguruar dhënien e një gabimi gjatë fshirjes së një treguesi në një tip të paplotë.
- Deklarimi i sintaksĂ«s pĂ«r pĂ«rcaktimin e parametrave variativĂ« me pikĂ« tĂ« shumĂ«fishta pa njĂ« presje paraprake Ă«shtĂ« shpallur i dhĂ«nĂ« pas. (pĂ«r shembull, kur shkruhet «void e(int...)» nĂ« vend tĂ« «void e(int, âŠ)»).
- Përdorimi i makrove për deklarimin e moduleve është i ndaluar.
- ĂshtĂ« shpallur i dhĂ«nĂ« pas kryerja e transformimeve tĂ« ndĂ«rlidhura implicit tĂ« vlerave tĂ« enumeruara nĂ« llogaritjet aritmetike. int main() { enum E1 { e }; enum E2 { f }; bool b = e <= 3.7; // e dhĂ«nĂ« pas int k = f - e; // e dhĂ«nĂ« pas int x = +f - e; // OK }
- Mbështetja për krahasimin e drejtpërdrejtë të array-ve është ndërprerë. int arr1[5]; int arr2[5]; bool same = arr1 == arr2;
- Klasa template is_trivial është shpallur e dhënë pas.
Burimi: opennet.ru
