De standaard C++26 is goedgekeurd

De ISO-commissie voor de standaardisering van de programmeertaal C++ heeft de definitieve versie van de specificatie voor de internationale standaard "C++26" goedgekeurd. De in de specificatie opgenomen mogelijkheden worden al gedeeltelijk ondersteund door de compilers GCC, Clang en Microsoft Visual C++. De standaardbibliotheken die C++26 ondersteunen zijn geïmplementeerd binnen het Boost-project.

In de komende twee maanden zal de goedgekeurde specificatie zich in de fase van documentvoorbereiding voor publicatie bevinden, waarin het werk zal worden uitgevoerd om typografische fouten en typefouten te corrigeren. Begin november zal de resulterende versie van het document naar ISO worden gestuurd voor publicatie onder de formele naam ISO/IEC 14882:2026.

Belangrijkste kenmerken van C++26:

  • Elementen van contractprogrammering (Contracts) zijn geïmplementeerd, waarmee formele specificaties voor interfaces kunnen worden gedefinieerd met behulp van drie nieuwe operators: pre (voorwaarde), post (nawerking) en contract_assert (assertie-controle). De operator "pre" definieert de voorwaarden die vóór de aanroep moeten worden vervuld (controle van de invoerwaarden); "post" definieert de voorwaarden die na de uitvoering moeten worden nageleefd (vereisten voor uitvoerwaarden); contract_assert definieert de voorwaarden waaronder uitzonderingen optreden. Deze mogelijkheid zal beschikbaar zijn in GCC 16. int f(const int x) pre (x != 1) ///< vereisten voor de invoer post (r : r == x && r != 2) ///< vereisten voor het resultaat; r — waarde van het resultaat { contract_assert (x != 3); return x; }
  • Ondersteuning voor reflectie (Reflection) is toegevoegd, waarmee elementen van het programma tijdens de compilatiefase kunnen worden gevolgd en gewijzigd. Nieuwe operators "^^" zijn toegevoegd voor het verkrijgen van meta-informatie over grammaticale constructies en "[:…:]" voor het uitvoeren van inverse transformaties. Voor de transformatie en verwerking van informatie die tijdens inspectie is verkregen, is de bibliotheek std::meta voorgesteld, en mogelijkheden zoals berekeningen met constanten zijn beschikbaar. Ondersteuning voor reflectie zal worden toegevoegd in 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’ en ‘j’ hebben verschillende waarden. static_assert(constant_of(^^i) == constant_of(^^j)); ///< ‘i’ en ‘j’ zijn gelijk static_assert(^^i != std::meta::reflect_constant(42)); ///< verschilt van de waarde 42
  • De operator «template for» is toegevoegd voor het itereren over elementen, zoals parameterpakketten, tuple-achtige objecten en reflectie-resultaten (meta-objecten), tijdens de compilatiefase in de stijl van een gewone loop. Bij het uitvoeren van «template for» wordt de body van de loop voor elk element uitgepakt en elke iteratie wordt verwerkt in een afzonderlijk bereik waarin de in de loop veranderende variabele een constante is. In de context van reflectie kan «template for» worden toegepast om de eigenschappen van klassen of enumeraties te doorlopen. Deze mogelijkheid komt beschikbaar in GCC 16. void f() { template for (constexpr int I : std::array{1, 2, 3}) { static_assert(I < 4); } } wordt uitgepakt in: 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); } } }
  • Het std::execution-framework is toegevoegd voor asynchrone en parallelle uitvoering van code. Er worden objecten verstrekt zoals de scheduler, die de uitvoeringsplanner (thread, threadpool, GPU, event loop) definieert, sender, die de uit te voeren taak definieert, en receiver — de handler voor het resultaat. 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();
  • De std::simd-bibliotheek is toegevoegd voor het parallel uitvoeren van bewerkingen op gegevens met behulp van SIMD-instructiesets, zoals AVX-512 en NEON, met gebruik van het standaard type-systeem van 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;
  • Een implementatie van een variabele grootte vector (array) std::inplace_vector is voorgesteld, die op de stack wordt geplaatst en waarvan de grootte wordt bepaald tijdens de compilatie. De API is vergelijkbaar met std::vector, maar de array-elementen worden niet in de «heap» opgeslagen, maar binnen het object. inplace_vector a(10); inplace_vector b(std::move(a)); assert(a.size() == 10);
  • De directive «#embed» is toegevoegd, bedoeld voor het inbedden van binaire bronnen in de code. const unsigned char icon_display_data[] = { #embed "art.png" };
  • Ondersteuning toegevoegd voor het genereren en verwerken van uitzonderingen tijdens compilatie bij fouten in de context van 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); }
  • Een datastructuur std::hive geïmplementeerd voor ongeordende opslag van gegevens en het mogelijk maken van hergebruik van geheugen dat is vrijgekomen na verwijderde elementen. De structuur is geoptimaliseerd voor workloads met hoge intensiteit van toevoegen en verwijderen van elementen in willekeurige volgorde. In tegenstelling tot arrays veroorzaakt het verwijderen van een element in std::hive geen verschuiving van andere elementen, maar markeert het verwijderde element als leeg, terwijl de vrijgekomen positie wordt ingevuld bij het toevoegen van een nieuw element.
  • Toegevoegd is de bibliotheek std::linalg met een API voor lineaire algebra, gebaseerd op BLAS.
  • Ondersteuning toegevoegd voor de synchronisatiemechanisme Hazard pointer, waarmee zonder het instellen van locks het vrijgeven van geheugen van objecten die nog steeds in andere threads worden gebruikt, wordt voorkomen. Bij het verwijderen van een object wordt het alleen gemarkeerd als verwijderd, terwijl het geheugen dat door het object wordt gebruikt, pas wordt vrijgegeven wanneer alle threads de hazard-pointer hebben verwijderd die tijdens de interactie met het object is ingesteld.
  • Ondersteuning toegevoegd voor het synchronisatiemechanisme RCU (Read-Copy Update) – bij schrijfbewerkingen wordt een nieuwe instantie van het object aangemaakt, terwijl leesbewerkingen niet worden geblokkeerd en blijven werken met de oude instantie. Na voltooiing van de wijziging wordt de nieuwe instantie actief en worden nieuwe leesbewerkingen met deze uitgevoerd, terwijl de oude instantie pas wordt verwijderd na voltooiing van de threads die deze lezen.
  • Wijzigingen aangebracht ter versterking van de veiligheid van de standaardbibliotheek, zoals controles van geldige waarden en buffer-overloop. Bijvoorbeeld, bij toegang tot het element "constexpr reference operator[](size_type idx) const;" wordt een controle toegevoegd voor de voorwaarde "idx < size()".
  • De mogelijkheid geboden om het sleutelwoord "constexpr" te gebruiken met een soort operator "new" (placement new) voor het plaatsen van een object in vooraf toegewezen geheugen tijdens compilatie.
  • Er is ondersteuning toegevoegd voor gestructureerde bindingen in de context van 'constexpr', dat wil zeggen dat verwijzingen naar constante uitdrukkingen zelf ook constante uitdrukkingen kunnen zijn. Ondersteuning is gerealiseerd voor arrays en eenvoudige structuren. constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
  • Gestructureerde bindingen hebben de mogelijkheid gekregen om de '...' syntaxis te gebruiken voor het aangeven van pakketten die het resterende aantal elementen uit de toegewezen sequentie vastleggen. auto [x,y,z] = f(); // in de variabelen x, y, z zullen de drie elementen worden opgeslagen die door f() worden teruggegeven. auto […xs] = f(); // in het pakket xs zullen alle elementen worden opgeslagen die door f() worden teruggegeven. auto [x, …rest] = f(); // In x wordt het eerste element opgeslagen, en in rest de overige. auto [x, y, …rest] = f(); // In x wordt het eerste element opgeslagen, in y het tweede, en in rest het derde. auto [x, …rest, z] = f(); // in x het eerste, in rest het tweede, in z het derde.
  • Ondersteuning voor 'triviale verplaatsbaarheid' van types is toegevoegd, waardoor verplaatsingen van objecten van een bepaald type geoptimaliseerd kunnen worden door ze in het geheugen te kopiëren zonder constructeurs of destructeurs aan te roepen. Voor klassen zijn de eigenschappen memberwise_trivially_relocatable en memberwise_replaceable geïmplementeerd, en voor laag-niveau verplaatsing van een of meerdere objecten zijn de functies trivially_relocate_at en trivially_relocate toegevoegd.
  • Ondersteuning is geïmplementeerd voor het koppelen van de functie main() aan globale modules en het definiëren van de functie main() in benoemde modules.
  • De variabele operator 'friend' ('friend Ts…') is toegevoegd.
  • Attributen voor gestructureerde bindingen zijn geïmplementeerd;
  • De syntaxis '= delete("redenen")' is toegevoegd.
  • De basisset van symbolen bevat nu '@', '$' en '`'.
  • De mogelijkheid is geboden om gestructureerde bindingen te gebruiken als voorwaarde in de if- en switch-operatoren.
  • Er is de mogelijkheid toegevoegd om meerdere plaatsvervangende variabelen met de naam '_' in hetzelfde bereik te gebruiken, bijvoorbeeld, de volgende constructies zijn nu geldig: struct S { int _, _; }; void func() { int _, _; } void other() { int _; // eerder gaf dit een waarschuwing in -Wunused modus }
  • Er is een mogelijkheid om stringliteralen te gebruiken in contexten waarin ze niet worden gebruikt voor het initialiseren van karakterarrays en niet in de resulterende code terechtkomen, maar alleen tijdens compilatie worden toegepast voor diagnostische berichten en preprocessing, bijvoorbeeld als parameters van instructies en attributen _Pragma, asm, extern, static_assert, [[deprecated]] en [[nodiscard]].
  • Er zijn ingebouwde functies toegevoegd: '__builtin_is_within_lifetime' voor het controleren van de activiteit van alternatieven in unions en '__builtin_is_virtual_base_of' voor het controleren of de basisklas virtueel is.
  • Triviale oneindige lussen zonder ongedefinieerd gedrag zijn geïmplementeerd.
  • Er wordt een foutmelding weergegeven bij het verwijderen van een pointer naar een onvolledig type.
  • De syntaxis voor het definiëren van variabele parameters met een ellipsis zonder voorafgaande komma is deprecated (bijvoorbeeld wanneer 'void e(int...)' in plaats van 'void e(int, ...)' wordt opgegeven).
  • Het gebruik van macro's voor het declareren van modules is verboden.
  • De impliciete conversies van enumeratiewaarden in rekenkundige berekeningen zijn verouderd verklaard. int main() { enum E1 { e }; enum E2 { f }; bool b = e <= 3.7; // verouderd int k = f - e; // verouderd int x = +f - e; // OK }
  • De ondersteuning voor directe vergelijking van arrays is beëindigd. int arr1[5]; int arr2[5]; bool same = arr1 == arr2;
  • De sjabloonklaas is_trivial is verouderd verklaard.

    Bron: opennet.ru
Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster