C++26

From Wikipedia, the free encyclopedia

Remove ads

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.

Stručná fakta Verze jazyka C++ ...

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]

Remove ads

Vlastnosti

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

Jazyk

  • 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]

Knihovna

  • <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ů
Remove ads

Příjetí

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]

Remove ads

Odkazy

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads