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. Pracovní verze již obsahuje všechny rysy a byla rozeslána k mezinárodnímu hlasování o připomínkách. 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í v Londýně v březnu 2026. 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é.
Vlastnosti Do C++26 jsou připravované následující změny:
Jazyk Reflexe v době překladu. (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í přidává klíčové slovo contract_assert a identifikátory pre a post se speciálním významem (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 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 () 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ů () 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, ...).“
Knihovna : 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ě Paralelní plánovač poskytující standardní kontext asynchronního provádění, který zaručuje postup <simd>: podpora paralelního přístupu k datům (SIMD) Asynchronní model odesilatele/příjemce pro strukturovaný paralelismus (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í Několik lidí okamžitě po skončení standardizačního zasedání v Sofii, které dokončilo seznam vlastností nové verze, a po mezinárodní konferenci „C++ On See“ vydalo zprávy z jednání.
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“.
Někteří členové C++ výboru z různých důvodů kritizovali kontrakty pro C++26.
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, byla kvůli implementačním chybám z C++26 odstraněna a odložena do pozdějšího standardu.
Odkazy Reference
Externí odkazy Podpora vlastností C++26 v překladačích
Kategorie:C++