Přeskočit na obsah

C++26

Z Wikipedie, otevřené encyklopedie
Verze jazyka C++

C++26 je neformální označení připravované verze normy ISO/IEC-14882 programovacího jazyka C++, která bude následníkem C++23. Aktuální pracovní verze je N5014.[1] Pracovní verze již obsahuje všechny rysy[2] a byla rozeslána k mezinárodnímu hlasování o připomínkách.[3] Po vyřešení některých připomínek na zasedání standardizačního výboru v listopadu 2025 v Kona na Hawaji se očekává, že výbor pro standardy C++ dokončí řešení připomínek, technicky zfinalizuje pracovní verzi, kterou rozešle pro závěrečné hlasování při následujícím standardizačním zasedání[2] v Londýně v březnu 2026.[4] Některé z budoucích vlastností lze vyzkoušet na krátkých úryvcích kódu použitím experimentálních a standardních překladačů s použitím Compiler Explorer. Některé varianty překladačů se odlišují pouze krátkými identifikátory dokumentů navrhujících nové vlastnosti, které implementují, jako je „P3372“ pro constexpr containery a adaptéry.

Návrhy a vlastnosti, které C++ Standards Committee přijalo do standardu, stejně jako zápisy ze standardizačního zasedání v bulharské Sofii jsou veřejně dostupné.[5]

Vlastnosti

[editovat | editovat zdroj]

Do C++26 jsou připravované následující změny:

  • Reflexe v době překladu.[6] (experimentální větev Clang, jejímž autorem je Dan Katz, která implementuje tyto vlastnosti. Tuto větev, větve GCC a jiné implementace z EDG je možné vyzkoušet pomocí Compiler Explorer.) Pro vyvolání reflexí se místo klíčového slova reflexpr používá nový operátor ^^.
  • Kontraktové programování[7] přidává klíčové slovo contract_assert a identifikátory pre a post se speciálním významem[8] (podpora kontraktů je dostupná v experimentální větvi Clang, jejímž autorem je Eric W Fiselier, a v několika variantách GCC jako Compiler Explorer.)
  • Nevyhodnocované řetězce
  • Přidání znaků @, $ a ` do základní znakové sady
  • = delete("reason");
  • Uživatelsky generované zprávy static_assert[9]
  • Chybové chování při čtení neinicializovaných dat
  • Smazání ukazatele na neúplný typ musí být označeno za chybnou konstrukci
  • Odstranění nedoporučovaných porovnání polí
  • Strukturované vazby (anglicky bindings) pro constexpr a reference na proměnné s constexpr
  • constexpr umístění new
  • constexpr změna typu z void*
  • constexpr kontejnery a adaptéry
  • Variadické friend funkce
  • Umožnění vyhazování výjimek při vyhodnocování konstant
  • Zástupné proměnné bez jména
  • Řazení omezení obsahujících fold výrazy
  • Strukturované vazby mohou zavést balíček s proměnným počtem prvků (anglicky pack)[10]
  • Pack indexování
  • Atributy pro strukturované vazby
  • Deklarace strukturovaných vazeb v roli podmínek
  • Nová direktiva #embed (poprvé představená v C23) pro přidání binárních prostředků a pro __has_embed, které umožňuje testování dostupnosti prostředků pomocí direktiv preprocesoru
  • Oxfordský způsob psaní variadických parametrů s čárkou, tj. „zákaz parametrů vyjádřených třemi tečkami bez předchozí čárky. Syntaxe (int...) je nekompatibilní s jazykem C, škodlivá pro C++, a lze ji snadno nahradit (int, ...).“[11]
  • <meta>: podpora reflexí při překladu
  • Podpora anotací v reflexích, které se chovají jinak než existující systém atributů používaných překladačem
  • <contracts>: podpora kontraktového programování
  • Lepší kontrola mezí ve standardní knihovně[12]
  • Paralelní plánovač poskytující standardní kontext asynchronního provádění, který zaručuje postup[13]
  • <simd>: podpora paralelního přístupu k datům (SIMD)
  • Asynchronní model odesilatele/příjemce pro strukturovaný paralelismus[14] (Libunifex je implementační prototyp, který lze přeložit na C++17 nebo novějších verzích)
  • <hazard_pointer>: hazardní ukazatele pro vlákna
  • std::copyable_function
  • std::is_within_lifetime
  • <hive>: podpora datové struktury Hive, která znovuvyužívá paměť vymazaných prvků
  • <rcu>: podpora mechanismu pro bezpečné zpětné získávání paměti read-copy-update
  • <inplace_vector>: podpora datové struktury vektor na místě, což je velikostně přizpůsobitelné souvislé pole pevné kapacity bez změn umístění
  • std::submdspan()
  • Nativní popisovače pro souborové proudy
  • std::formatter<std::filesystem::path>
  • Propojení sřetězcových proudů se std::string_view
  • Propojení std::bitset se std::string_view
  • std::views::concat
  • Spojování řetězců se string views
  • <text_encoding>: podpora přístupu k registru znakových sad IANA
  • Tisk prázdných řádků pomocí std::println()
  • std::ranges::generate_random
  • <linalg>: volné rozhraní pro funkce lineární algebry vycházející z BLAS
  • Podpora hašování pro hodnoty třídy std::chrono
  • Přidání protokolu n-tic do std::complex
  • Více constexpr pro <cmath> a <complex>
  • Přidání nových předpon z SI 2022 do ratios: std::quecto, std::ronto, std::ronna, a std::quetta
  • Aritmetika se saturací, mimo jiné std::add_sat a std::div_sat
  • <debugging>: podpora ladění a jazykové vlastnosti pro podporu debuggerů

Příjetí

[editovat | editovat zdroj]

Několik lidí okamžitě po skončení standardizačního zasedání v Sofii, které dokončilo seznam vlastností nové verze,[13][15] a po mezinárodní konferenci „C++ On See“ vydalo zprávy z jednání.[16]

Všichni upozorňovali zejména na velkou změnu, kterou představuje zavádění reflexí v době překladu. Konkrétně, Herb Sutter, předseda Standardizačního výboru ISO C++ a Hana Dusíková, asistentka předsedy pracovní skupiny „Vývoj jazyka“ Standardizačního výboru C++, popsali potenciální dopady začlenění reflexí do jazyka C++ jako „zcela nový jazyk“.[13]

Někteří členové C++ výboru z různých důvodů kritizovali kontrakty pro C++26.[17]

Vlastnost triviální relokatability, pro kterou byly navrženy nové identifikátory/specifikátory vlastností třídy trivially_relocatable_if_eligible a replaceable_if_eligible,[18] byla kvůli implementačním chybám z C++26 odstraněna a odložena do pozdějšího standardu.[19]

V tomto článku byl použit překlad textu z článku C++26 na anglické Wikipedii.

  1. Working Draft, Standard for Programming Language C++ [online]. ISO/IEC, 2025-08-05. Dostupné online.
  2. 1 2 C++ IS Schedule [online]. JTC1/SC22/WG21 - The C++ Standards Committee - ISOCPP [cit. 2025-09-06]. Dostupné online.
  3. The life of an ISO proposal: from "cool idea" to "international standard" [online]. Standard C++ Foundation [cit. 2025-09-06]. Dostupné online.
  4. Upcoming Meetings, Past Meetings [online]. The Standard C++ Foundation [cit. 2025-09-06]. Dostupné online.
  5. mailing2025-07 post-Sofia [online]. [cit. 2025-09-06]. Dostupné online.
  6. Wyatt Childers. P2996R4 - Reflection for C++26 [online]. WG21, 2024-06-26. Dostupné online.
  7. Contract assertions (since C++26) - cppreference.com [online]. [cit. 2025-03-09]. Dostupné online.
  8. C++ keywords - cppreference.com [online]. [cit. 2025-07-27]. Dostupné online.
  9. DARGO, Sandor. C++26: user-generated static_assert messages [online]. The Standard C++ Foundation [cit. 2025-09-06]. Dostupné online.
  10. REVZIN, Barry; WAKELY, Jonathan. 2024-11-22 [cit. 2024-12-27]. Dostupné online.
  11. P3176R1: The Oxford variadic comma [online]. [cit. 2024-12-09]. Dostupné online.
  12. SUTTER, Herb. Crate-training Tiamat, un-calling Cthulhu:Taming the UB monsters in C++ [online]. Dostupné online.
  13. 1 2 3 SUTTER, Herb. Trip report: June 2025 ISO C++ standards meeting (Sofia, Bulgaria) [online]. [cit. 2025-09-06]. Dostupné online.
  14. SUTTER, Herb. Trip report: Summer ISO C++ standards meeting (St Louis, MO, USA) [online]. [cit. 2025-09-06]. Dostupné online.
  15. LOPEZ-GOMEZ, Javier. Summer WG21 Meeting; trip report [online]. [cit. 2025-09-06]. Dostupné online.
  16. DARGO, Sandor. Trip report: C++ On Sea 2025 [online]. [cit. 2025-09-06]. Dostupné online.
  17. Timur Doumler. C++26 Contract Assertions, Reasserted [online]. WG 21, 2025-10-06. Dostupné online.
  18. C++ keywords - cppreference.com [online]. [cit. 2025-07-27]. Dostupné online.
  19. Herb Sutter. Trip report: November 2025 ISO C++ standards meeting (Kona, USA) [online]. Sutter's Mill, 2025-11-10. Dostupné online.

Externí odkazy

[editovat | editovat zdroj]