C++-i standardimise ISO komitee on lĂ”petanud rahvusvahelise standardi âC++26â lĂ”pliku spetsifikatsiooni heakskiitmise. Spetsifikatsioonis esitatud vĂ”imalustest toetavad osa juba GCC, Clang ja Microsoft Visual C++ kompilaatorid. C++26 standardiga ĂŒhilduvad teegid on teostatud Boost projekti raames.
JĂ€rgmise kahe kuu jooksul kinnitatud spetsifikatsioon lĂ€bib dokumendi avaldamise ettevalmistuse etapi, kus viiakse lĂ€bi toimetamis- ja trĂŒkiveakontroll. Novembri alguses saadetakse lĂ”plik dokument ISO-le avaldamiseks formaalse nimega ISO/IEC 14882:2026.
C++26 peamised omadused:
- On realiseeritud lepinguprogrammeerimise elemendid (Contracts), mis vÔimaldavad mÀÀratleda vormilised spetsifikatsioonid liideste jaoks kolme uue operaatori abil: pre (eeltingimus), post (jÀrgtingimus) ja contract_assert (vÀite kontrollimine). Operaator "pre" mÀÀratleb eeltingimused, mis peavad olema tÀidetud enne kutsumist (sisendi kontroll); "post" - tingimused, mis peavad olema tÀidetud pÀrast tÀitmist (vÀljundi nÔuded); contract_assert - erandite tekkimise tingimused. See vÔimalus saabub GCC 16-s. int f(const int x) pre (x != 1) // sisendi nÔuded post (r : r == x && r != 2) // tulemuse nÔuded; r - tulemuse vÀÀrtus { contract_assert (x != 3); return x; }
- Lisatud on refleksiooni (Reflection) tugi, mis vĂ”imaldab jĂ€lgida ja muuta programmi elemente kompileerimise etapis. Uued operaatorid «^^» on lisatud grammatilise konstruktsiooni meta-informatsiooni saamiseks ning «[:âŠ:]» tagasisuunatava muundamise teostamiseks. Muundamiseks ja kontrollimise kĂ€igus saadud teabe töötlemiseks on pakutud std::meta teek ja saadaval on sellised vĂ”imalused nagu konstantidega arvutamine. Refleksiooni tugi lisatakse 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â ja âjâ omavad erinevaid vÀÀrtusi. static_assert(constant_of(^^i) == constant_of(^^j)); // âiâ ja âjâ on sama static_assert(^^i != std::meta::reflect_constant(42)); // erineb vÀÀrtusest 42
- Lisatud on «template for» operaator elementide, nagu tuletiste sarnaste objektide ja peegeldamise (metaobjektid) pakettide lĂ€bimiseks, mis toimub kompileerimise etapis tavalise tsĂŒkli stiilis. Kui «template for» kĂ€ivitatakse, avatakse tsĂŒkli keha iga elemendi jaoks ja iga iteratsioon töödeldakse eraldi ulatuses, kus tsĂŒklis muutuv muutuja on konstant. Peegeldamise kontekstis vĂ”ib «template for» rakendada klasside vĂ”i loetelude atribuutide lĂ€bimiseks. See funktsionaalsus peaks ilmuma GCC 16. void f() { template for (constexpr int I : std::array{1, 2, 3}) { static_assert(I < 4); } } avatakse jĂ€rgmisena: 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); } } }
- Lisatud std::execution raamistik koodi asĂŒnkroonseks ja paralleelseks tĂ€itmiseks. Pakutakse scheduler objekte, mis mÀÀratleb tööd tehtava ajakava (protsess, niitide kogum, GPU, sĂŒndmuste tsĂŒkkel), sender, mis mÀÀratleb tĂ€idetava töö, ja receiver â tulemuse töötleja. 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();
- Lisatud std::simd teek andmete töötlemise operatsioonide paralleelimiseks, kasutades SIMD kĂ€ske nagu AVX-512 ja NEON, C++ standardse tĂŒĂŒpide sĂŒsteemi abil. 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;
- Pakutud on muutuva suurusega vektori (massivi) std::inplace_vector rakendust, mis asub kuhjas ja mille suurus mÀÀratakse kompileerimise kÀigus. API on sarnane std::vector'ile, kuid massiivi elemendid hoitakse mitte "virnas", vaid objekti sees. inplace_vector a(10); inplace_vector b(std::move(a)); assert(a.size() == 10);
- Lisatud direktiiv «#embed», mis on mÔeldud binaarsete ressursside koodi integreerimiseks. const unsigned char icon_display_data[] = { #embed «art.png» };
- Lisatud tugi genereerimiseks ja erandite töötlemiseks kompileerimise etapis, kui esinevad vead constexpr kontekstis. 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); }
- Rakendatud andmestruktuur std::hive, et hoida andmeid mittekorrastatult ja tagada mĂ€lule, mis on vabanenud kustutatud elementide tĂ”ttu, korduvkasutamine. Struktuur on optimeeritud kĂ”rge elemendi lisamise ja kustutamise intensiivsusega koormuste jaoks, olenemata nende jĂ€rjekorrast. Erinevalt massiividest ei pĂ”hjusta std::hive elemendi kustutamine teiste elementide nihkumist, vaid kustutatud elemendi mĂ€rgistamine tĂŒhjaks, millele jĂ€rgnevalt tĂ€idetakse vabaks saanud asukoht uue elemendi lisamisel.
- Lisatud raamatukogu std::linalg, millel on API lineaaralgebra jaoks, mis pÔhineb BLAS-il.
- Lisati toetatakse Hazard pointeri sĂŒnkroniseerimise mehhanismi, mis vĂ”imaldab vĂ€ltida objektide mĂ€lust vabastamist, millega jĂ€tkatakse töötamist teistes lĂ”imedes, ilma lukustamisteta. Objekti kustutamisel, lihtsalt mĂ€rgitakse see kustutatuks, kuid objekti poolt hĂ”ivatud mĂ€lu vabastatakse alles siis, kui kĂ”ik lĂ”imed eemaldavad hazard-viit, mis on kehtestatud objekti töötamise ajal.
- Lisati toetatakse RCU (Read-Copy Update) sĂŒnkroniseerimise mehhanismi â kirjutamistegevuste puhul luuakse uus objekti eksemplar ning lugemisoperatsioonid ei blokeeru, vaid jĂ€tkavad töö tegemist vana eksemplariga. PĂ€rast muudatuse lĂ”petamist muutub uus eksemplar aktiivseks, ja uued lugemisoperatsioonid tehakse juba selle baasil, mille jĂ€rel vana eksemplar eemaldatakse pĂ€rast nende lugemist lĂ”pule viinud lĂ”imede lĂ”petamist.
- Tehtud muudatused standardraamatukogu turvalisuse tugevdamiseks, nagu lubatud vÀÀrtuste ja mĂ€lupiiride kontrollimised. NĂ€iteks, kui pÀÀsete juurde elemendile âconstexpr reference operator[](size_type idx) const;â, lisatakse kontroll tingimuse âidx < size()".
- Proovis vĂ”imalust kasutada vĂ”tmesĂ”na âconstexprâ koos uue operatori tĂŒĂŒbiga (placement new), et paigutada objekt eelnevalt eraldatud mĂ€llu kompileerimise ajal.
- Lisatud on struktureeritud sidemete tugi (structured binding) âconstexprâ kontekstis, see tĂ€hendab, et viidatud konstantsetele vĂ€ljenditele vĂ”ivad nĂŒĂŒd olla samuti konstantseteks vĂ€ljenditeks. Tugi on rakendatud massiivide ja lihtsate struktuuride jaoks. constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Struktureeritud sidemetes on lisatud vĂ”imalus kasutada sĂŒntaksit ââŠâ pakettide (pack) mÀÀramiseks, et haarata ĂŒlejÀÀnud elemendid mÀÀratud jĂ€rjestusest. auto [x,y,z] = f(); // muutuja x, y, z saavad kolm elementi, mis f() tagastab. auto [âŠxs] = f(); // paketti xs saavad kĂ”ik elemendid, mis f() tagastab. auto [x, âŠrest] = f(); // x-sse salvestatakse esimene element, rest-i â ĂŒlejÀÀnud. auto [x, y, âŠrest] = f(); // x-sse salvestatakse esimene element, y-sse â teine, rest-i â kolmas. auto [x, âŠrest, z] = f(); // x-sse â esimene, rest-i â teine, z-sse â kolmas.
- Lisatud tugi tĂŒĂŒpi âtriviaalne nihutatavusâ (Trivial Relocatability), mis vĂ”imaldab optimeerida objektide liikumist lĂ€bi nende kloonimise mĂ€lus ilma konstruktorite vĂ”i destruktorite kutsumiseta. Klasside jaoks on rakendatud omadused memberwise_trivially_relocatable ja memberwise_replaceable ning madala taseme nihutamiseks ĂŒhe vĂ”i mitme objekti puhul on lisatud funktsioonid trivially_relocate_at ja trivially_relocate.
- Rakendatud on toetust funktsiooni main() sidumiseks globaalsetele moodulitele ja funktsiooni main() mÀÀratlemiseks nimetatud moodulites.
- Lisatud on muutujaoperaator âfriendâ (âfriend TsâŠâ).
- Rakendatud on atribuudid struktureeritud sidumist jaoks;
- Lisatud on sĂŒntaks â= delete(âpĂ”hjusâ)â.
- Algsete sĂŒmbolite komplekti on lisatud â@â, â$â ja â`â.
- On antud vÔimalus kasutada struktureeritud sidumist tingimuseks protseduurides if ja switch.
- Lisatud vĂ”imalus kasutada korraga mitut tĂ€itmismuutuja nimega â_â ĂŒhes ulatuses, nĂ€iteks on nĂŒĂŒd kehtivad konstruktsioonid: struct S { int _, _; }; void func() { int _, _; } void other() { int _; // varem kuvati hoiatust reĆŸiimis -Wunused }
- Antud vÔimalus kasutada stringi literaale kontekstis, kus neid ei kasutata mÀrgistusmassiivide initsialiseerimiseks ja nad ei satu lÔppkoodisse, vaid kasutatakse ainult kompileerimise ajal diagnostikateadeteks ja eelprotsessimiseks, nÀiteks direktiivide ja atribuutide _Pragma, asm, extern, static_assert, [[deprecated]] ja [[nodiscard]] parameetritena.
- Lisatud sisseehitatud funktsioonid: â__builtin_is_within_lifetimeâ alternatiivi aktiivsuse kontrollimiseks liitumistes (union) ja â__builtin_is_virtual_base_ofâ kontrollimiseks, kas pĂ”hiklass on virtuaalne.
- Tehtud triviaalsete lĂ”putute tsĂŒklite rakendamine ilma mÀÀratlemata kĂ€itumiseta.
- Tagatakse viga, kui proovitakse kustutada nĂ€idikut mittetĂ€ieliku tĂŒĂŒbi peale.
- Muutus, et variatiivsete parameetrite mÀÀramise sĂŒntaks sĂŒmpaatilise kolmpunkti kujul on aegunud, kui eelnevat koma ei ole (nĂ€iteks, kui on mĂ€rgitud «void e(intâŠ)» asemel «void e(int, âŠ)»).
- Moodulite deklareerimiseks ei ole lubatud makrode kasutamine.
- Aegunud on varjatud teisenduste tegemine aritmeetilistes arvutustes loetletud vÀÀrtustega. int main() { enum E1 { e }; enum E2 { f }; bool b = e <= 3.7; // aegunud int k = f - e; // aegunud int x = +f - e; // OK }
- Otse massiivide vÔrdlemise to support on katkestatud. int arr1[5]; int arr2[5]; bool same = arr1 == arr2;
- Aegunud on malliklass is_trivial.
Allikas: opennet.ru
