C++26 standard on heaks kiidetud

ISO komitee, mis tegeleb C++ keele standardimisega, on lĂ€bi viinud viimase variandi spetsifikatsiooni, mis loob rahvusvahelise ŃŃ‚Đ°ĐœĐŽĐ°Ń€ĐŽĐž "C++26". Spetsifikatsioonis esitatud omadused on osaliselt juba toetatud GCC, Clang ja Microsoft Visual C++ kompilaatorites. C++26 standardraamatukogud on ellu viidud projekti Boost raames.

JĂ€rgmise kahe kuu jooksul viib kinnitatud spetsifikatsiooni dokument valmistamise etappi, kus teostatakse redigeerimist Ă”igekirja- ja trĂŒkivigade osas. Novembri alguses saadetakse dokumendi tulemuseks ISO-sse avaldamiseks ametliku nime all ISO/IEC 14882:2026.

C++26 peamised jooned:

  • On rakendatud lepinguprogrammeerimise (Contracts) elemendid, mis vĂ”imaldavad mÀÀratleda formaalsed spetsifikatsioonid liideste jaoks kolme uue operaatori abil: pre (eeltingimus), post (jĂ€rgtingimus) ja contract_assert (vĂ€idete kontroll). Operaator „pre“ mÀÀratleb eeltingimused, mis peavad olema tĂ€idetud enne kutsumist (sisendite kontroll); „post“ – tingimused, mis peavad olema tĂ€idetud pĂ€rast tĂ€itmist (vĂ€ljade nĂ”uded); contract_assert – erandite tekkimise tingimused. See funktsionaalsus lisatakse GCC 16-sse. int f(const int x) pre (x != 1) // sisendite 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 meta-informatsiooni saamiseks grammatilise konstruktsiooni kohta ja „[:
:]“ tagasimuundamiseks. Eldis KGTK ja vastavad vĂ”imalused, nagu konstantide arvutamine, on saadaval raamatukogus std::meta. Refleksiooni tugi lisatakse GCC 16-sse. 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 samad static_assert(^^i != std::meta::reflect_constant(42)); // erineb vÀÀrtusest 42
  • Lisatud on "template for" operaator, et lĂ€bida elemente, nagu parameetrite paketid, tuple-sarnased objektid ja refleksiooni tulemused (metaobjektid), kompilatsiooni etapis tavalisest tsĂŒklist. "Template for" lĂ€heneb tsĂŒkli kehale igas iteratsioonis eraldi nĂ€htavuses, kus tsĂŒkli muutuja on konstant. Refleksiooni kontekstis vĂ”ib "template for" kasutada klasside vĂ”i loendite omaduste lĂ€bimiseks. See vĂ”imalus saabub GCC 16. void f() { template for (constexpr int I : std::array{1, 2, 3}) { static_assert(I < 4); } } paisutatakse: 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 on std::execution raamistik asĂŒnkroonsete ja paralleelsete koodide tĂ€itmiseks. Pakutakse vĂ€lja scheduler objekte, mis mÀÀratleb töödeldavate ĂŒlesannete plaani (töötlus, niitide bassein, GPU, sĂŒndmuste tsĂŒkkel), sender, mis mÀÀratleb tĂ€idetava töö, ja receiver, mis on 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 < "Tere maailm! Olgu int."; return 13; }); sender auto add_42 = then(hi, [](int arg) { return arg + 42; }); auto [i] = this_thread::sync_wait(add_42).value();
  • Lisatud on std::simd raamatukogu, et paralleelselt teostada andmete operatsioone SIMD instruktsioonide kogumitega, nagu AVX-512 ja NEON, kasutades C++ standardtĂŒĂŒbide sĂŒsteemi. 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;
  • Pakkumine on vĂ€lja töötada muutuva suurusega vektor (massiv) std::inplace_vector, mis on paigutatud kuhja ja mille suurus mÀÀratakse kompilatsiooni etapis. API on lĂ€hedane std::vector'ile, kuid massiivid hoitakse mitte "kuhjas", vaid objekti sees. inplace_vector a(10); inplace_vector b(std::move(a)); assert(a.size() == 10);
  • Lisatud on direktiiv "#embed", mis on mĂ”eldud binaarsete ressursside koodile manustamiseks. const unsigned char icon_display_data[] = { #embed "art.png" };
  • Lisatud genereerimise ja töötlemise toe tugi kompileerimise etapis, kui esinevad vead kontekstis 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); }
  • Rakendatud andmestruktuur std::hive ebaĂŒhtlase andmete salvestamise ja kustutatud elementide vabaneva mĂ€lu taaskasutamise tagamiseks. Struktuur on optimeeritud koormuste jaoks, kus elementide lisamine ja kustutamine toimub suures mahus suvalises jĂ€rjekorras. Erinevalt massiividest ei pĂ”hjusta std::hive's elemendi kustutamine teiste elementide nihkumist, vaid eemaldatud element mĂ€rgistatakse tĂŒhjaks ning vabanev asend tĂ€idetakse uue elemendi lisamise korral.
  • Lisatud std::linalg teek lineaaralgebra jaoks, mis pĂ”hineb BLAS-il.
  • Lisatud Hazard pointeri sĂŒnkroniseerimise mehhanismi tugi, mis vĂ”imaldab vĂ€ltida objektide mĂ€lu vabastamist ilma lukustuseta, kui objektidega töötatakse teistes lĂ”imed. Kui objekt kustutatakse, mĂ€rgistatakse see lihtsalt kustutatuks, kuid objekti kasutatud mĂ€lu vabastatakse alles siis, kui kĂ”ik lĂ”imed eemaldavad hazard-viitaja, mis on mÀÀratud objekti töötamise ajal.
  • Lisatud RCU (Read-Copy Update) sĂŒnkroniseerimismehhanismi tugi — kirjutamise toimingute ajal luuakse objekti uus eksemplar, samas kui lugemise toimingud ei blokeeru, vaid jĂ€tkavad töötlust vana eksemplariga. PĂ€rast muudatuste lĂ”petamist muutub uus eksemplar aktiivseks ja uued lugemisoperatsioonid viiakse ellu selle kaudu, samal ajal kui vana eksemplar kustutatakse pĂ€rast kĂ”igi lugemisega tegelevate lĂ”imede lĂ”petamist.
  • Tehtud muudatused standardbiblioteegi turvalisuse parandamiseks, nĂ€iteks lubatavate vÀÀrtuste ja mĂ€lupiiride kontrollid. NĂ€iteks elemendi „constexpr reference operator[](size_type idx) const;” juurde lisatakse tingimuse „idx < size()" kontroll.
  • Antud vĂ”imalus kasutada mĂ€rksĂ”na „constexpr” koos „new” operaatori (placement new) variandiga, et paigutada objekt eelnevalt reserveeritud mĂ€llu kompileerimise ajal.
  • Lisatud on struktureeritud sidemete (structured binding) tugi 'constexpr' kontekstis, st konstantsete vĂ€ljendite viidatud variandid vĂ”ivad nĂŒĂŒd ise olla konstantsete vĂ€ljendite. Tugi on rakendatud massiivide ja lihtsate struktuuride jaoks. constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
  • Struktureeritud sidemetes on lisatud '...' sĂŒntaksi kasutamise vĂ”imalus pakettide (pack) nĂ€itamiseks, mis haaravad ĂŒlejÀÀnud elemendid mÀÀratud jĂ€rjestusest. auto [x,y,z] = f(); // muutuja x, y, z saavad kolm elementi, mille f() tagastab. auto [
xs] = f(); // paketis xs saavad kĂ”ik elemendid, mille f() tagastab. auto [x, 
rest] = f(); // x-s on esimene element ja rest-s ĂŒlejÀÀnud. auto [x, y, 
rest] = f(); // x-s on esimene element, y-s teine ja rest-s kolmas. auto [x, 
rest, z] = f(); // x-s on esimene, rest-s teine ja z-s kolmas.
  • Lisatud on 'triviaalne liigutatavus' (Trivial Relocatability) tĂŒĂŒpi toetamine, mis vĂ”imaldab optimeerida objektide liigutamist mÀÀratud tĂŒĂŒbi kaudu nende kloonimisega mĂ€lus ilma konstruktorite vĂ”i destruktorite kutsumata. Klasside jaoks on rakendatud omadused memberwise_trivially_relocatable ja memberwise_replaceable, ning madala taseme ĂŒhe vĂ”i mitme objekti liigutamiseks on lisatud funktsioonid trivially_relocate_at ja trivially_relocate.
  • Rakendatud on funktsiooni main() kinnitamise toetus globaalsetesse moodulitesse ja funktsiooni main() mÀÀramine nimetatud moodulites.
  • Lisatud on variatiivne operaator 'friend' ('friend Ts
').
  • Rakendatud on atribuudid struktureeritud sidemete jaoks;
  • Lisatud on sĂŒntaks '= delete("pĂ”hjus")'.
  • Algsesse sĂŒmbolite kogumisse on lisatud '@', '$' ja '`'.
  • Pakutud on vĂ”imalust kasutada struktureeritud sidumist (structured binding) kui tingimust if ja switch operaatorites.
  • Lisatud on vĂ”imalus kasutada mitut tĂ€itjat nimega '_' ĂŒhes ulatuses, nĂ€iteks, nĂŒĂŒd on jĂ€rgmised konstruktsioonid Ă”iged: struct S { int _, _; }; void func() { int _, _; } void other() { int _; // varem nĂ€idati hoiatust reĆŸiimis -Wunused }
  • SĂ”neteadlike stringikujundite kasutamine on vĂ”imaldatud kontekstis, kus neid ei kasutata sĂŒmbolite massiivi algatamiseks ja nad ei satuks lĂ”ppkoodisse, vaid kasutatakse ainult kompileerimise ajal diagnostiliste sĂ”numite ja eeltöötluse jaoks, nĂ€iteks direktiivide ja atribuudi _Pragma, asm, extern, static_assert, [[deprecated]] ja [[nodiscard]] parametritena.
  • Lisatud on hĂŒbriidfunktsioonid: „__builtin_is_within_lifetime” alternatiivide aktiivsuse kontrollimiseks ĂŒhendites (union) ja „__builtin_is_virtual_base_of” aluseks oleva klassi virtuaalsuse kontrollimiseks.
  • On rakendatud triviaalsetes lĂ”pututes tsĂŒklites, mis ei sisalda mÀÀramatut kĂ€itumist.
  • Viga nĂ€idatakse, kui proovite kustutada osutajat ebatĂ€ielikule tĂŒĂŒbile.
  • Mugavuse huvides on deklareeritud suhtes ettenĂ€htud sarnaste parameetrite defineerimise sĂŒntaks, kus enne kolme punkti pole koma (nĂ€iteks „void e(int
)“ asemel „void e(int, 
)“).
  • Makrode kasutamine moodulite deklareerimiseks on keelatud.
  • On liigitatud vananenuks, kui selgesĂ”naliselt muudetakse loetelu vÀÀrtusi arvutustes. int main() { enum E1 { e }; enum E2 { f }; bool b = e <= 3.7; // vananenud int k = f — e; // vananenud int x = +f — e; // OK }
  • Toetuse lĂ”petamine otse massiivide vĂ”rdlemiseks. int arr1[5]; int arr2[5]; bool same = arr1 == arr2;
  • Mugavused on klassifitseeritud nagu is_trivial.

    Allikas: opennet.ru
Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster