C++23

připravovaná verze standardu programovacího jazyka C++ From Wikipedia, the free encyclopedia

C++23 je verze normy ISO/IEC 14882 programovacího jazyka C++ z roku 2023, která navazuje na C++20. Závěrečný draft C++23 je N4950.[1][2]

Stručná fakta Verze jazyka C++ ...
Zavřít

Celkový plán pro C++23,[3][4] podle něhož měla být do C++23 zapracována knihovní podpora korutin, podpora modulárního programování ve standardní knihovně, exekutory a podpora sítí, byl přijat na závěrečném zasedání pro C++20 v únoru 2020 v Praze.

První zasedání WG21 zaměřené na C++23 se mělo uskutečnit ve Varně na začátku června 2020, ale bylo zrušeno kvůli pandemii covidu-19,[5][6] stejně jako zasedání v listopadu 2020 v New Yorku[7][6] a zasedání v únoru 2021 v Kona na Havaji.[7] Všechna následující zasedání uskutečněná do listopadu 2022 byla virtuální, od listopadu 2022 do závěrečného zasedání v únoru 2023 byla zasedání hybridní.[7] Norma C++23 byla technicky finalizována skupinou WG21 během hybridního zasedání v Issaquah v únoru 2023.[8]

Moderní verze „Hello, world“

Po mnoha změnách v knihovnách provedených v draftu C++23 vypadá nová verze programu Hello world takto:

#include <print>

int main()
{
    std::println("Hello, world!");
}

Vlastnosti

Ke změnám, které byly přijaty do C++23, patří:

Jazyk

  • explicitní parametr this objektu[9]
  • if consteval[10]
  • operátor vícerozměrných indexů[11]
  • statická volání a indexové operátory a statické lambda funkce[12][13]
  • zjednodušení implicitního přesunu[14]
  • auto(x) a auto{x}[15]
  • nové direktivy preprocesoru:
  • rozšíření životnosti některých dočasných entit ve smyčkách přes rozsah[18]
  • nový standardní atribut [[assume(expression)]][19]
  • vyvozování argumentů šablony třídy ze zděděných konstruktorů[20]
  • možnost použití návěstí na konci složeného příkazu[21]
  • povolení deklarace aliasů v inicializačních příkazech příkazů if, switch a for přes rozsah[22]
  • sufixy literálů pro std::size_t a odpovídající typ se znaménkem[23]
  • rozšířené typy s pohyblivou řádovou čárkou a literály pro tyto typy (podmíněně podporované)[24]
  • závorky () v lambda výrazech bez parametrů jsou nyní nepovinné[25]
  • atributy lambda výrazů[26]
  • změny v constexpr:
    • neliterální proměnné, návěstí, a příkazy goto v constexpr funkcích[27]
    • umožnění aby proměnné s paměťovou třídou static nebo thread_local bylo možné používat v konstantních výrazech v constexpr funkcích[28]
    • návratový typ a typy parametrů constexpr funkcí nemusí být literální typy
    • nyní je možné napsat constexpr funkci, jejíž žádné vyvolání nesplňuje požadavky na základní konstantní výraz[29]
  • zúžení kontextových konverzí na bool v static_assert a if constexpr[30]
  • vypuštění bílých znaků před spojením řádků[31]
  • deklarace pořadí prvků struktury je povinná[32]
  • ohraničené escape posloupnosti[33]
  • pojmenované univerzální znakové escapy[34]
  • změny v kódování textu:
    • podpora UTF-8 jako přenositelného kódování zdrojových souborů[35]
    • konzistentní kódování znakových literálů[36]
    • znakové sady a kódování[37]

Knihovna

Standardní podpora knihovních modulů

  • standardní knihovní moduly std a std.compat[38]

Knihovní podpora korutin

  • synchronní korutina std::generator pro rozsahy[39]

Podpora obecných programů

  • výsledkový typ std::expected[40]
  • monadické operace pro std::optional[41] a std::expected[42]
  • pomocná funkce std::to_underlying pro získání podkladových hodnot enum[43]
  • std::move_only_function pro funkční objekty, které podporují pouze přesun, ne kopírování[44]
  • std::forward_like[45]
  • std::invoke_r[46]
  • std::bind_back[47]
  • std::byteswap[48]
  • std::unreachable: funkce pro označení nedosažitelného kódu[49]
  • std::tuple je nyní kompatibilní s jinými objekty podobnými n-ticím[50]
  • specializace std::basic_common_reference pro std::reference_wrapper vracející referenční typy[51]
  • přidání implicitních argumentů pro forwardující konstruktor typu std::pair[18]

Podpora pro dobu překladu

  • podpora constexpr v:
    • std::type_info::operator==[52]
    • std::bitset[53]
    • std::unique_ptr[54]
    • pro některé funkce z hlavičkového souboru <cmath>[55]
    • pro vestavěná přetížení funkcí std::to_chars a std::from_chars[56]
  • nástroje pro metaprogramování:
    • typové rysy std::is_scoped_enum,[57] std::is_implicit_lifetime,[58] std::reference_constructs_from_temporary, a std::reference_converts_from_temporary.[59]
  • přidání podpory výhradně přesunových typů pro porovnání v konceptech[60]

Iterátory, rozsahy a podpora algoritmů

  • nová funkce pro konverze rozsahů std::ranges::to[61]
  • nové algoritmy pro omezené rozsahy:
    • std::ranges::starts_with
    • std::ranges::ends_with[62]
    • std::ranges::contains
    • std::ranges::contains_subrange[63]
    • std::ranges::find_last a jiné varianty[64]
    • verze iota, shift_left, a shift_right používající rozsahy[65]
    • algoritmy obalující rozsahy[66]
  • nový helper std::ranges::range_adaptor_closure pro uživatelské definice uzávěrů adaptérů rozsahů[47]
  • nové adaptéry rozsahů:
    • std::views::zip a další varianty
    • std::views::adjacent a další varianty[67]
    • std::views::join_with[68]
    • std::views::slide
    • std::views::chunk[69]
    • std::views::chunk_by[70]
    • std::views::as_rvalue[71]
    • std::views::as_const[72]
    • std::views::repeat[73]
    • std::views::stride[74]
    • std::views::cartesian_product[75]
    • std::views::enumerate[76]
  • oprava konstantních iterátorů, zarážek (anglicky sentinels) a rozsahů; std::ranges::cbegin a další podobné nástroje vracející konstantní iterátory musejí být plně funkční i pro mělké const pohledy (např. std::span)[72]
  • umožnění použití iterátorů přes rozsahy jako vstupů pro algoritmy nepracující s rozsahy[77]
  • uvolnění adaptérů rozsahu, aby je bylo možné používat pro typy umožňující pouze přesun[78]
  • explicitní zpřístupnění některých víceparametrových konstruktorů pohledůexplicit[79]

Podpora správy paměti

  • std::out_ptr a std::inout_ptr pro interoperabilitu s jazykem C[80]
  • std::allocate_at_least a std::allocator::allocate_at_least[81]
  • explicitní funkce std::start_lifetime_as pro správu životnosti pro typy s implicitní životností[82]
  • zákaz uživatelských specializací std::allocator_traits[83]

Podpora zpracování řetězců a textu

  • nové členské funkce a změny řetězcových typů:
    • std::basic_string_view::contains a std::basic_string::contains[84]
    • zákaz konstrukce std::basic_string a std::basic_string_view z nullptr[85]
    • explicitní konstruktor rozsahu pro std::basic_string_view[86]
    • std::basic_string::resize_and_overwrite[87]
    • přetížení reference rvalue std::basic_string::substr pro vytváření efektivních řezů[88]
  • formátování rozsahů, n-tic, escapovaných prezentací znaků a řetězců, std::thread::id, a stacktraces.[89][90][91]

Podpora diagnostiky

  • knihovna stacktrace[92]

Podpora vstupů a výstupů

  • funkce std::print a std::println pro formátovaný výstup v novém hlavičkovém souboru <print>[93]
  • nový hlavičkový soubor <spanstream>[94]
  • podpora výlučného režimu ve funkcích z hlavičkového souboru std::fstream[95]
  • std::basic_ostream::operator<<(const volatile void*)[96]

Podpora kontejnerů

  • vícerozměrná verze span std::mdspan[97][98][99][100]
  • konstruovatelnost a přiřaditelnost kontejnerů z jiných kompatibilních rozsahů[61]
  • adaptéry kontejnerů flat set a flat map[101][102]
  • nevyvozování kontextu pro alokátory v průvodcích vyvozování kontejnerů[103]
  • heterogenní vymazání přetížení pro asociativní kontejnery[104]
  • umožnění konstrukce dvojic iterátorů pro zásobník a frontu[105]
  • vyžadování, aby std::span a std::basic_string_view byly triviálně kopírovatelné[106]

Podpora kompatibility s jazykem C

  • nový hlavičkový soubor <stdatomic.h>[107]

Hlášení o vadách jazyka

  • Syntaxe C++ identifikátorů podle Přílohy 31 Mormy Unicode[108]
  • umožnění duplicitních atributů[109]
  • změna rozsahu platnosti koncového návratového typu lambda funkcí[110]
  • omezení změn přetížených operátorů porovnání[111]
  • zrušeno nedoporučování volatilních složených přiřazení[112][113]
  • oprava kompatibility a přenositelnosti typu char8_t[114]
  • zmírnění požadavků na wchar_t, aby odpovídal existující praxi[115]
  • povolení určitých ukazatelů a referencí na this nebo na entity neznámého počátek (souřadnicového systému)/původ v konstantní výrazy[116]
  • zavádění of bezprostředně-escalating funkcí promoted na bezprostředně funkcí[117]
  • povolení static_assert(false) v kontextech neinstanciovaných šablon

Opravy chyb v knihovně

  • změny v knihovně rozsahů:
    • podmíněné vypůjčující rozsahy[118]
    • opravy adaptérů vstupních rozsahů a std::counted_iterator[119]
    • uvolnění omezení na std::ranges::join_view[120]
    • přejmenování std::ranges::split_view na std::ranges::lazy_split_view a nové split_view[121]
    • odstraněno omezení std::default_initializable z konceptu std::ranges::view[122]
    • nové std::ranges::owning_view (pohledy s vlastněním)[123]
    • oprava std::ranges::istream_view[124]
  • změny v knihovně pro formátování textu:
    • std::basic_format_string[125]
    • kontroly formátových řetězců v době překladu
    • omezení velikosti binárního kódu std::format_to[126]
    • oprava zpracovávání locale v časových formátovačích[127]
    • zlepšení odhadu šířky[128] a počtu výplňkových znaků v std::format[129]
    • použití forwardujících referencí v argumentech formátu pro umožnění nekonstantně formátovatelných typů[130]
  • úplné constexpr std::variant a std::optional[131]
  • pomocné typy odvozené z std::variant v std::visit[132]

Odstraněné a nedoporučované vlastnosti

Odstraněné vlastnosti:

  • podpora garbage collectoru a (striktní) bezpečnosti ukazatelů[133] (což znamená, že bude dostupná pouze volná bezpečnost ukazatelů[134]). Tato minimální podpora garbage collection (a pro ni potřebná bezpečnost ukazatelů) byla přidána do C++11, ale žádný kompilátor ji nikdy nepodporoval, takže v C++23 byla odstraněna.[135] To však neznamená, že se v C++ nepoužívalo a nepoužívá mnoho implementací GC, například Boehm GC (kterou lze použít také v režimu ladění pro detekci úniků paměti), a taková GC je často implementována v C++, aby ji mohly používat i jiné jazyky
  • smíšené spojování literálů širokých řetězců[136]
  • nekódovatelné široké znakové literály a víceznakové široké znakové literály.[137]

Nedoporučované vlastnosti:

  • std::aligned_storage a std::aligned_union[138]
  • std::numeric_limits::has_denorm[139]

Znovu zavedené vlastnosti, které byly dříve nedoporučované:

  • používání operátoru čárky v indexových výrazech již není nedoporučované, ale jeho sémantika byla změněna, aby podporovala přetížitelný n-adický operator[]
  • hlavičkové soubory pro jazyk C (odpovídající hlavičkovým souborům <*.h> pro kompatibilitu s jazykem C)

Publikováno jako technické specifikace

Podpora překladače

  • Do překladače Clang byla částečná podpora C++23 postupně doplňována od verze 13 z roku 2021 do verze 18 z roku 2024; je dostupná pomocí volby -std=c++23 . [141]
  • Do překladače GCC byla částečná experimentální podpora C++23 přidána v roce 2021 ve verzi 11; je dostupná pomocí volby -std=c++2b nebo -std=c++23. Existuje také má volba -std=gnu++2b pro povolení GNU rozšíření s experimentální podporou C++23. [142]

Historie

Protože nebylo možné pořádat prezenční zasedání skupiny WG21, byly některé změny schváleny na několika virtuálních zasedáních skupiny WG21 po neformálních hlasováních:

Po virtuálním zasedání WG21 9. listopadu 2020 byly přidány následující vlastnosti schválené neformálním hlasováním:[143]

  • sufixy literálů pro std::size_t a odpovídající typy se znaménkem
  • členská funkce contains pro std::basic_string a std::basic_string_view vracející, zda řetězec obsahuje zadaný podřetězec nebo znak
  • knihovna stacktrace (<stacktrace>) vycházející z knihovny Boost.Stacktrace
  • znakový typ std::is_scoped_enum
  • hlavičkový soubor <stdatomic.h> pro interoperabilitu s atomickými operacemi v jazyce C

Po virtuálním zasedání WG21 22. února 2021 byly přidány následující vlastnosti, které byly schváleny neformálním hlasováním:[144]

  • možnost vypustit závorky () prázdného seznamu parametrů v lambda výrazech
  • oprava vstupních adaptérů rozsahů a counted_iterator
  • uvolnění požadavků na time_point::clock[145]
  • std::visit pro třídy, které jsou odvozené z std::variant
  • locks lock lockables[146]
  • mechanismus pro označení rozsahů jako conditionally borrowed, který vývojářům umožňuje kontrolovat, zda je bezpečné s nimi zacházet jako s „půjčenými“ (tj. lze je bezpečně používat i po přechodu do funkce, která rozsah převzala jako argument, aniž by bylo nutné kopírovat nebo přesouvat data)
  • std::to_underlying

Po letním 2021 plenárním virtuálním zasedání pro ISO C++ standardy v červnu 2021 byly neformálním hlasováním schváleny nové vlastnosti a zprávy o defektech:[147]

  • consteval, pokud (if consteval)
  • zúžení kontextové konverze pro bool
  • povolení duplicitních atributů
  • řetězcový proud (<spanstream>) založený na std::span
  • std::out_ptr() a std::inout_ptr()
  • constexpr pro std::optional, std::variant, a std::type_info::operator==
  • konstruktory dvojic iterátorů pro std::stack (zásobník) a std::queue (frontu)
  • změny v knihovně rozsahů:
    • zobecnění starts_with a ends_with pro libovolné rozsahy
    • přejmenování split_view to lazy_split_view a nový split_view
    • uvolnění omezení na join_view
    • Odstraňování default_initializable omezení z koncept view
    • konstruktor rozsahu pro std::basic_string_view
  • zákaz konstrukcí std::basic_string a std::basic_string_view z nullptr
  • std::invoke_r
  • vylepšení std::format
  • přidání implicitních argumentů k forwardujícímu konstruktoru pro std::pair

Od podzimu 2021 ISO C++ standardy plenárním virtuálním zasedání v říjnu 2021 byly schváleny nové vlastnosti a zprávy o defektech neformálním hlasováním:[148]

  • neliterální proměnné, návěstí a příkazy goto v constexpr funkcích, ale stále chybně utvořené pro jejich vyhodnocení v době překladu
  • explicitní this objekt parametr
  • změny znakové sady a kódování
  • nové direktivy preprocesoru: #elifdef a #elifndef. Obě direktivy byly přidány v C23 (aktualizace normy jazyka C) a GCC 12[149]
  • umožnění deklarace aliasů v init-příkazech
  • přetěžování operátoru vícerozměrného indexu (například arr[1, 2])
  • decay copy v jazyce: auto(x) nebo auto(x)
  • změny v knihovně pro formátování textu:
    • oprava zpracovávání locales ve formátovačích času
    • použití předběžných referencí v argumentech formátu umožňuje typy podobné typu std::generator
  • přidání typového aliasu std::pmr::stacktrace, který je ekvivalentní s std::basic_stacktrace<std::pmr::polymorphic_allocator>[150]
  • změny v knihovně rozsahů:
    • upřesněná definice view
    • nahrazení šablony funkce std::ranges::istream_view šablonami aliasů std::ranges::istream_view, std::ranges::wistream_view a objektem std::views::istream
    • zip rodina adaptérů rozsahů:
      • zip_view
      • zip_transform_view
      • adjacent_view (a std::views::pairwise je ekvivalentní s std::views::adjacent<2>)
      • adjacent_transform_view (a std::views::pairwise_transform je ekvivalentní s std::views::adjacent_transform<2>)
  • std::move_only_function
  • monadické operace pro std::optional
  • šablona členské funkce std::basic_string::resize_and_overwrite
  • výpis volatile ukazatele (volatile T*)
  • std::byteswap
  • heterogenní přetížení erase a extract pro asociativní kontejnery
  • každá specializace std::span a std::basic_string_view je triviálně kopírovatelná
  • přidání podmíněných noexcept specifikací pro std::exchange[151]
  • přepracování specifikace a použití typů třídy integer[152]
  • vyjasnění statusu hlavičkových souborů z jazyka C ve standardní knihovně C++: Hlavním účelem hlavičkových souborů z jazyka C je zajištění interoperability s jazykem ISO C a s ostatními systémy, které používají ABI a spojovací konvence jazyka C. Ve zdrojovém kódu, který je určen pouze pro jazyk C++, nejsou hlavičkové soubory z jazyka C potřebné. Standardní knihovna C++ poskytuje hlavičkové soubory z jazyka C pro programy jako plně podporovanou, nikoliv nedoporučovaná část, ale zároveň nedoporučuje jejich používání v kódu, který nezajišťuje interoperabilitu s jinými programovacími jazyky.[153]

Po virtuálním zasedání WG21 7. února 2022 byly přidány následující vlastnosti, které byly schváleny na základě neformálních hlasování:[154]

  • povolení atributů operátorů volání lambda funkcí
  • std::expected
  • constexpr v cmath a cstdlib
  • funkce pro označení nedosažitelného kódu
  • ranges::to
  • typová vlastnost pro detekci vazby reference na dočasný objekt
  • std::unique_ptr je nyní constexpr
  • podpora uživatelem definovaných adaptérů rozsahů
  • ranges::iota, ranges::shift_left a ranges::shift_right
  • views::join_with
  • použití okének v adaptérech rozsahů: views::chunk a views::slide
  • views::chunk_by

Po virtuálním zasedání WG21 25. července 2022 byly přidány následující vlastnosti a zprávy o defektech, které byly schváleny neformálním hlasováním:[155]

  • omezení změn přetížených operátorů porovnání
  • zrušeno nedoporučování bitových přiřazení do volatile proměnné
  • přidána direktiva preprocesoru #warning
  • odstraněny nekódovatelné široké znakové literály a víceznakové široké znakové literály
  • povolení návěstí na konci složených příkazů
  • přidány escape posloupnosti ve složených závorkách pro čísla v osmičkové a šestnáctkové soustavě a pro univerzální jména znaků
  • umožnění, aby constexpr funkcí na nikdy být konstantní výrazy
  • zjednodušení některých implicitních přesunových pravidel z C++20 a umožnění implicitního přesunu při vrácení rvalue reference
  • přidána možnost zadávání znaků Unicode jménem. Například U'\N{LATIN CAPITAL LETTER A WITH MACRON}' // Ekvivalent U'\u0100'
  • umožnění, aby operator() a lambda funkce mohly být static
  • umožnění ukazatelů a referencí na this a entity neznámého původu v konstantních výrazech
  • umožnění, aby implementace definovala rozšířené typy s pohyblivou řádovou čárkou vedle tří standardních typů. Přidané typové aliasy std::float16_t, std::float32_t, std::float64_t, std::float128_t, std::bfloat16_t pro tyto rozšířené typy zpřístupněné v hlavičkovém souboru <stdfloat>, odpovídající literální sufixy f16 f32 f64 f128 bf16nebo F16 F32 F64 F128 BF16 a přidané přetížení do různých standardních knihovních funkcí, jejichž parametry jsou typy s pohyblivou řádovou čárkou
  • přidán atribut [[assume(expression)]], který umožňuje překladači předpokládat, že poskytnutý výraz je pravdivý pro umožnění optimalizací
  • povinná podpora zdrojových souborů v UTF-8; poskytuje přenositelné kódování zdrojových souborů
  • umožnění, aby pole prvků typu char a unsigned char byla inicializována řetězcovými literály v kódování UTF-8
  • odstranění požadavku, aby wchar_t mohl kódovat všechny znaky rozšířené znakové sady, ve výsledku umožňuje, aby se UTF-16 mohlo používat pro široké řetězcové literály
  • přidáno std::mdspan, pohled na vícerozměrná pole podobný std::span
  • doplnění flat_map a flat_set ke standardní knihovně
  • přidány funkce std::print a std::println pro tisk formátovaného textu na stdout
  • pojmenované moduly std a std.compat pro import standardní knihovny
  • přidána podpora výlučného režimu fstreams, podobná použití příznaku "x" v fopen
  • umožnění, aby std::format zpracovávalo rozsahy, n-tice a jiné kontejnery
  • přidáno std::forward_like
  • funkce std::string::substr nyní používá přesunovou sémantiku
  • přidána funkce std::generator, která implementuje generátor korutin modelující std::ranges::input_range
  • views::cartesian_product, views::repeat, views::stride, views::as_const, views::as_rvalue
  • přidány nové algoritmy: ranges::find_last, ranges::contains, a rozsahy záhyb algoritmy
  • std::tuple je kompatibilní s jinými objekty podobnými n-ticím
  • explicitní řízení životnosti pro typy s implicitní životností
  • funkce std::bitset a celočíselná přetížení funkcí std::to_chars a std::from_chars jsou kompatibilní s constexpr
  • přidána podpora pouze přesunových typů pro porovnávání konceptů
  • iterátory přes rozsahy jako vstupy pro algoritmy nepracující s rozsahy
  • uvolnění adaptérů rozsahů pro typy umožňující pouze přesun

Po hybridním zasedání WG21 7. listopadu 2022 byly doplněny následující vlastnosti a zprávy o defektech, které byly schváleny neformálním hlasováním:[156]

  • umožnění, aby operator[] byl static
  • umožnění, aby se proměnné s třídou paměti static a thread_local mohly používat v constexpr funkcích, pokud jsou použitelné v konstantních výrazech
  • propagace consteval vzhůru, což znamená, že určité existující funkce s constexpr nyní budou consteval, pokud mohou být vyvolané pouze v době překladu
  • životnost dočasných proměnných, které se vyskytují v inicializátoru for cyklů přes rozsahy, rozšířena aby pokrývala celý cyklus
  • zrušeno nedoporučování (všech, nejen bitových) složené přiřazení do proměnných volatile
  • monadické funkce pro std::expected
  • synchronizuje výstup funkce std::print s podkladovým proudem, pokud se používá nativní Unicode API[157]

Po závěrečném hybridním zasedání WG21 ve dnech 6.-11. února 2023 byly přidány následující vlastnosti a zprávy o defektech, které byly schváleny neformálním hlasováním:[158]

  • odkaz na normu Unicode[159]
  • stashing iterators (iterátory, které si ukládají kopii hodnot) mohou být pouze vstupní[160]
  • views::enumerate
  • explicitní zpřístupnění víceparametrových konstruktorů pohledů
  • mírné uvolnění pravidel pro rozsahy
  • vylepšení escapování v std::format
  • zlepšení odhadu šířky v std::format
  • přípustné vyplňkové znaky v std::format
  • formátování thread::id a výstupu stacktrace
  • typová vlastnost std::is_implicit_lifetime
  • std::common_reference_t v std::reference_wrapper musí být referenčního typu
  • zákaz uživatelských specializací std::allocator_traits
  • std::pmr::generator
  • označení std::numeric_limits::has_denorm jako zastaralé
  • záruky dokončení fáze std::barrier

Odkazy

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.