Kinnitamisel C++26 standard

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
Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster