C++23
připravovaná verze standardu programovacího jazyka C++ From Wikipedia, the free encyclopedia
Remove ads
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]
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]
Remove ads
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
thisobjektu[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)aauto{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,switchaforpřes rozsah[22] - sufixy literálů pro
std::size_ta 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
gotovconstexprfunkcích[27] - umožnění aby proměnné s paměťovou třídou
staticnebothread_localbylo možné používat v konstantních výrazech vconstexprfunkcích[28] - návratový typ a typy parametrů
constexprfunkcí nemusí být literální typy - nyní je možné napsat
constexprfunkci, jejíž žádné vyvolání nesplňuje požadavky na základní konstantní výraz[29]
- neliterální proměnné, návěstí, a příkazy
- zúžení kontextových konverzí na
boolvstatic_assertaif 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:
Knihovna
Standardní podpora knihovních modulů
- standardní knihovní moduly
stdastd.compat[38]
Knihovní podpora korutin
- synchronní korutina
std::generatorpro rozsahy[39]
Podpora obecných programů
- výsledkový typ
std::expected[40] - monadické operace pro
std::optional[41] astd::expected[42] - pomocná funkce
std::to_underlyingpro získání podkladových hodnot enum[43] std::move_only_functionpro 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::tupleje nyní kompatibilní s jinými objekty podobnými n-ticím[50]- specializace
std::basic_common_referenceprostd::reference_wrappervracejí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
constexprv: - nástroje pro metaprogramování:
- 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:
- nový helper
std::ranges::range_adaptor_closurepro uživatelské definice uzávěrů adaptérů rozsahů[47] - nové adaptéry rozsahů:
std::views::zipa další variantystd::views::adjacenta další varianty[67]std::views::join_with[68]std::views::slidestd::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::cbegina 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
Podpora zpracování řetězců a textu
- nové členské funkce a změny řetězcových typů:
std::basic_string_view::containsastd::basic_string::contains[84]- zákaz konstrukce
std::basic_stringastd::basic_string_viewznullptr[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::substrpro 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ů
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::spanastd::basic_string_viewbyly 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
thisnebo 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_viewnastd::ranges::lazy_split_viewa novésplit_view[121] - odstraněno omezení
std::default_initializablez konceptustd::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é
constexprstd::variantastd::optional[131] - pomocné typy odvozené z
std::variantvstd::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:
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)
Remove ads
Publikováno jako technické specifikace
- Concurrency TS v2[140]
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++2bnebo-std=c++23. Existuje také má volba-std=gnu++2bpro povolení GNU rozšíření s experimentální podporou C++23. [142]
Remove ads
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_ta odpovídající typy se znaménkem - členská funkce
containsprostd::basic_stringastd::basic_string_viewvracejí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::visitpro třídy, které jsou odvozené zstd::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ý nastd::span std::out_ptr()astd::inout_ptr()constexprprostd::optional,std::variant, astd::type_info::operator==- konstruktory dvojic iterátorů pro
std::stack(zásobník) astd::queue(frontu) - změny v knihovně rozsahů:
- zobecnění
starts_withaends_withpro libovolné rozsahy - přejmenování
split_viewtolazy_split_viewa novýsplit_view - uvolnění omezení na
join_view - Odstraňování
default_initializableomezení z konceptview - konstruktor rozsahu pro
std::basic_string_view
- zobecnění
- zákaz konstrukcí
std::basic_stringastd::basic_string_viewznullptr 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
constexprfunkcích, ale stále chybně utvořené pro jejich vyhodnocení v době překladu - explicitní
thisobjekt parametr - změny znakové sady a kódování
- nové direktivy preprocesoru:
#elifdefa#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)neboauto(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í sstd::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_viewa objektemstd::views::istream ziprodina adaptérů rozsahů:zip_viewzip_transform_viewadjacent_view(astd::views::pairwiseje ekvivalentní sstd::views::adjacent<2>)adjacent_transform_view(astd::views::pairwise_transformje ekvivalentní sstd::views::adjacent_transform<2>)
- upřesněná definice
std::move_only_function- monadické operace pro
std::optional - šablona členské funkce
std::basic_string::resize_and_overwrite - výpis
volatileukazatele (volatile T*) std::byteswap- heterogenní přetížení
eraseaextractpro asociativní kontejnery - každá specializace
std::spanastd::basic_string_viewje triviálně kopírovatelná - přidání podmíněných
noexceptspecifikací prostd::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::expectedconstexprvcmathacstdlib- funkce pro označení nedosažitelného kódu
ranges::to- typová vlastnost pro detekci vazby reference na dočasný objekt
std::unique_ptrje nyníconstexpr- podpora uživatelem definovaných adaptérů rozsahů
ranges::iota,ranges::shift_leftaranges::shift_rightviews::join_with- použití okének v adaptérech rozsahů:
views::chunkaviews::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
volatilepromě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
constexprfunkcí 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ýtstatic - umožnění ukazatelů a referencí na
thisa 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_tpro tyto rozšířené typy zpřístupněné v hlavičkovém souboru<stdfloat>, odpovídající literální sufixyf16f32f64f128bf16neboF16F32F64F128BF16a 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
charaunsigned charbyla inicializována řetězcovými literály v kódování UTF-8 - odstranění požadavku, aby
wchar_tmohl 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_mapaflat_setke standardní knihovně - přidány funkce
std::printastd::printlnpro tisk formátovaného textu na stdout - pojmenované moduly
stdastd.compatpro import standardní knihovny - přidána podpora výlučného režimu
fstreams, podobná použití příznaku "x" vfopen - umožnění, aby
std::formatzpracovávalo rozsahy, n-tice a jiné kontejnery - přidáno
std::forward_like - funkce
std::string::substrnyní 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::tupleje kompatibilní s jinými objekty podobnými n-ticím- explicitní řízení životnosti pro typy s implicitní životností
- funkce
std::bitseta celočíselná přetížení funkcístd::to_charsastd::from_charsjsou kompatibilní sconstexpr - 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[]bylstatic - umožnění, aby se proměnné s třídou paměti
staticathread_localmohly používat vconstexprfunkcích, pokud jsou použitelné v konstantních výrazech - propagace
constevalvzhůru, což znamená, že určité existující funkce sconstexprnyní budouconsteval, pokud mohou být vyvolané pouze v době překladu - životnost dočasných proměnných, které se vyskytují v inicializátoru
forcyklů 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::prints 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::ida výstupustacktrace - typová vlastnost
std::is_implicit_lifetime std::common_reference_tvstd::reference_wrappermusí být referenčního typu- zákaz uživatelských specializací
std::allocator_traits std::pmr::generator- označení
std::numeric_limits::has_denormjako zastaralé - záruky dokončení fáze
std::barrier
Remove ads
Odkazy
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads