Komiteti ISO për standardizimin e gjuhës C++ ka përfunduar miratimin e variantit përfundimtar të specifikimit, që formon standardin ndërkombëtar "C++26". Mundësitë e paraqitura në specifikim tashmë mbështeten pjesërisht 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, gjatë së cilës do të bëhet punë për redaktimin e gabimeve ortografike dhe tipografike. Në fillim të nëntorit, variantin përfundimtar të dokumentit do ta dërgojmë në ISO për publikim me emrin zyrtar ISO/IEC 14882:2026.
Karakteristikat kryesore të C++26:
- JanĂ« implementuar elementĂ«t e programimit kontraktual (Contracts), qĂ« lejojnĂ« pĂ«rcaktimin e specifikimeve formale tĂ« ndĂ«rfaqeve pĂ«rmes tre operatorĂ«ve tĂ« rinj: pre (kushte paraprake), post (kushte pasuese) dhe contract_assert (kontrolli i pohimit). Operator '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 e shfaqjes sĂ« pĂ«rjashtimeve. Kjo mundĂ«si do tĂ« shfaqet 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 e rezultatit { contract_assert (x != 3); return x; }
- ĂshtĂ« shtuar mbĂ«shtetje pĂ«r refleksionin (Reflection), qĂ« mundĂ«son ndjekjen dhe modifikimin e elementeve tĂ« programĂ«s gjatĂ« fazĂ«s sĂ« kompilimit. JanĂ« shtuar operatorĂ« tĂ« rinj «^^» pĂ«r tĂ« marrĂ« metainformacion nĂ« lidhje me konstruktin gramatikor dhe «[:âŠ:]» pĂ«r tĂ« kryer rikthimin e kundĂ«rt. PĂ«r konvertimin dhe trajtimin e informacionit tĂ« marrĂ« gjatĂ« inspektimit, Ă«shtĂ« propozuar biblioteka std::meta dhe janĂ« nĂ« dispozicion mundĂ«si si llogaritjet me konstanta. 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)); // ndryshon nga vlera 42
- Shtuar operatori "template for" për të iteruar elementët, të tilla si paketat e parametrave, objektet që ngjajnë me tuple dhe rezultatet e refleksionit (metaobjekteve), në fazën e përpilimit me stilin e një cikli të zakonshëm. Gjatë ekzekutimit të "template for", trupi i ciklit zgjerohet për çdo element dhe çdo iteracion trajtohet në një fushë të veçantë të dukshme, në të cilën variabla e ndryshueshme gjatë ciklit është një konstantë. Në kontekstin e refleksionit, "template for" mund të aplikohet për të kaluar nëpër pronat e klasave ose enumerimeve. Ky funksionalitet 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); } } }
- Shtuar framework-u std::execution pĂ«r ekzekutimin asinkron dhe paralel tĂ« kodit. Ofron objekte scheduler, qĂ« pĂ«rcakton planifikuesin e ekzekutimit (thread, pool threads, GPU, event loop), sender, qĂ« pĂ«rcakton punĂ«n qĂ« do tĂ« kryhet, dhe receiver â pĂ«rpunuesin 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();
- Shtuar biblioteka std::simd për paralelizimin e ekzekutimit të operacioneve mbi të dhëna duke përdorur grupe instrukcionesh SIMD, si AVX-512 dhe NEON, duke shfrytëzuar 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;
- Propozuar implementimi i vektorit (masiv) me madhësi të ndryshueshme std::inplace_vector, i vendosur në stack, me madhësinë që përcaktohet në fazën e kompilim. API është e ngjashme me std::vector, por elementet e masivit ruhen jo në "heap", por brenda objektit. inplace_vector a(10); inplace_vector b(std::move(a)); assert(a.size() == 10);
- ĂshtĂ« shtuar direktiva «#embed», e cila Ă«shtĂ« e destinuar pĂ«r integrim nĂ« kodin e burimeve binarĂ«. const unsigned char icon_display_data[] = { #embed «art.png» };
- ĂshtĂ« shtuar mbĂ«shtetje pĂ«r gjenerimin dhe trajtimin e pĂ«rjashtimeve gjatĂ« fazĂ«s sĂ« kompilimit nĂ« rast tĂ« gabimeve nĂ« kontekstin 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); }
- ĂshtĂ« realizuar struktura e dhĂ«nave std::hive pĂ«r ruajtjen e pa renditur tĂ« tĂ« dhĂ«nave dhe pĂ«r tĂ« siguruar riciklimin e memories qĂ« Ă«shtĂ« liruar pas elementeve tĂ« fshirĂ«. Struktura Ă«shtĂ« optimizuar pĂ«r ngarkesa me intensitet tĂ« lartĂ« tĂ« shtimit dhe fshirjes sĂ« elementeve nĂ« rregull tĂ« rastĂ«sishĂ«m. Ndryshe ngaArrays, fshirja e njĂ« elementi nĂ« std::hive nuk shkakton tĂ«rheqjen e elementeve tĂ« tjera, por i jep njĂ« etiketim elementit tĂ« fshirĂ« si tĂ« zbrazĂ«t dhe e mbush pozitat e liruar me shtimin e njĂ« elementi tĂ« ri.
- ĂshtĂ« shtuar biblioteka std::linalg me API pĂ«r algjebrĂ«n lineare, e bazuar nĂ« BLAS.
- ĂshtĂ« shtuar mbĂ«shtetja pĂ«r mekanizmin e sinkronizimit Hazard pointer, i cili lejon parandalimin e çlirimit tĂ« memories sĂ« objekteve pa vendosur bllokime, ndĂ«rsa vazhdohet puna me to nĂ« thread-e tĂ« tjera. Kur njĂ« objekt fshihet, ai vetĂ«m shĂ«nohet si i fshirĂ«, por memoria e zĂ«nĂ« nga objekti çlirohet vetĂ«m kur tĂ« gjitha thread-et heqin hazard-uan, i cili Ă«shtĂ« vendosur gjatĂ« punĂ«s me objektin.
- ĂshtĂ« shtuar mbĂ«shtetja pĂ«r mekanizmin e sinkronizimit RCU (Read-Copy Update) â gjatĂ« operacioneve tĂ« shkruar 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 tashmĂ« kryhen me tĂ«, ndĂ«rsa ekzemplari i vjetĂ«r Ă«shtĂ« fshirĂ« pas pĂ«rfundimit tĂ« thread-eve qĂ« e lexojnĂ« atĂ«.
- Janë bërë ndryshime për të forcuar sigurinë e bibliotekës standarde, siç janë kontrollet e vlefshmërisë dhe daljes jashtë kufijve të tamponit. Për shembull, gjatë qasjes në elementin «constexpr reference operator[](size_type idx) const;» shtohet një kontroll i kushtit «idx < size()".
- ĂshtĂ« ofruar mundĂ«sia e pĂ«rdorimit tĂ« fjalĂ«s kyçe «constexpr» me variantin e operatorit «new» (placement new) pĂ«r vendosjen e njĂ« objekti nĂ« memorie tĂ« alokuar paraprakisht gjatĂ« kompilimit.
- ĂshtĂ« shtuar mbĂ«shtetje pĂ«r lidhje tĂ« strukturuara (structured binding) nĂ« kontekstin «constexpr», dmth. referencat nĂ« shprehje konstante tani mund tĂ« jenĂ« vetĂ« shprehje konstante. MbĂ«shtetje Ă«shtĂ« realizuar pĂ«r matrix 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 treguesit (pack), qĂ« kapin numrin e mbetur tĂ« elementeve nga sekuenca e caktuar. auto [x,y,z] = f(); // nĂ« variablat x, y, z do tĂ« regjistrohen tre elemente, qĂ« kthehen nga f(). auto [âŠxs] = f(); // nĂ« paketĂ«n xs do tĂ« regjistrohen tĂ« gjitha elementet, qĂ« kthehen nga f(). auto [x, âŠrest] = f(); // NĂ« x do tĂ« regjistrohet elementi i parĂ«, ndĂ«rsa nĂ« rest â elementĂ«t e tjerĂ«. auto [x, y, âŠrest] = f(); // NĂ« x do tĂ« regjistrohet 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.
- Shtohet mbështetje për "lëvizshmërinë triviale" të tipave (Trivial Relocatability), duke lejuar optimizimin e lëvizjeve të objekteve të këtij tipi përmes klonimit të tyre në memorie pa thirrjen e konstruktoreve ose destruktoreve. Për klasat janë zbatuar pronat memberwise_trivially_relocatable dhe memberwise_replaceable, dhe për lëvizjen në nivel të ulët të një ose disa objekteve janë shtuar funksionet trivially_relocate_at dhe trivially_relocate.
- ĂshtĂ« realizuar mbĂ«shtetje pĂ«r lidhjen e funksionit main() me modul global dhe pĂ«rcaktimin e funksionit main() nĂ« modul tĂ« emĂ«ruar.
- ĂshtĂ« shtuar operatori variativ "friend" ("friend TsâŠ").
- Janë realizuar atribute për lidhje të strukturuara;
- ĂshtĂ« shtuar sintaksa '= delete("arsye")'.
- Shtohen simbolet "@", "$" dhe "`" në setin e simbolit bazë.
- ĂshtĂ« mundĂ«suar pĂ«rdorimi i lidhjeve tĂ« strukturuara (structured binding) si kusht nĂ« operatorĂ«t if dhe switch.
- Shtuar mundësia e përdorimit të disa variablave të plotësimit me emrin «_» në një fushë të njëjtë pamjeje, për shembull, tani janë struktura të sakta: struct S { int _, _; }; void func() { int _, _; } void other() { int _; // më parë shfaqej një paralajmërim në modin -Wunused }
- Ofrohet mundësia e përdorimit të literalëve të vargut në kontekste ku ata nuk përdoren për inicializimin e një array simbolesh dhe nuk përfshihen në kodin përfundimtar, por përdoren vetëm gjatë kompilimit për mesazhe diagnostike dhe përproçesim, për shembull, si parametra të drejtimeve dhe atributeve _Pragma, asm, extern, static_assert, [[deprecated]] dhe [[nodiscard]].
- Shtuar funksione të integruara: «__builtin_is_within_lifetime» për të verifikuar aktivitetin e alternativës në unione (union) dhe «__builtin_is_virtual_base_of» për të kontrolluar nëse klasa bazë është virtuale.
- Implementuar cikle triviale të pafundme pa sjellë sjellje të papërcaktuar.
- Siguruar një mesazh gabimi kur hiqet një pikator për një tip të papërfunduar.
- Deklarimi i sintaksĂ«s sĂ« vjetruar pĂ«r pĂ«rcaktimin e parametrave variativĂ« me pika pa njĂ« presje tĂ« mĂ«parshme (p.sh., kur spesifikohet «void e(intâŠ)» nĂ« vend tĂ« «void e(int, âŠ)»).
- Përdorimi i makroseve për shpalljen e moduleve është i ndaluar.
- ĂshtĂ« bĂ«rĂ« e papranueshme realizimi i transformimeve tĂ« nĂ«nkuptuara tĂ« vlerave tĂ« enumeruara nĂ« llogaritjet aritmetike. int main() { enum E1 { e }; enum E2 { f }; bool b = e <= 3.7; // e papranueshme int k = f â e; // e papranueshme int x = +f â e; // OK }
- Nuk mbështetet më krahasimi direkt i array-eve. int arr1[5]; int arr2[5]; bool same = arr1 == arr2;
- Klasa model is_trivial është shpallur e vjetruar.
Burimi: opennet.ru
