C++20
verze standardu popisujícího programovací jazyk C++, vydaná roku 2020 From Wikipedia, the free encyclopedia
Remove ads
C++20 je verze normy ISO/IEC 14882 programovacího jazyka C++ z roku 2020, která nahradila předchozí verzi C++17, a později byla sama nahrazena verzí C++23.[1] Technicky byla dopracována[2] skupinou WG21 na zasedání v Praze v únoru 2020,[3] její závěrečná pracovní verze byla ohlášena v březnu 2020,[4] schválena byla 4. září 2020[5][6] a publikována v prosinci 2020.[7]
Remove ads
Vlastnosti
C++20 přidává více nových velkých vlastností než C++14 nebo C++17.[8] Obsahuje mimo jiné následující změny:[9]
Jazyk
- koncepty,[10] a jejich stručná syntaxe[11]
- moduly[12]
- pojmenované inicializátory (anglicky designated initializers)[13] (založené na vlastnosti z C99 a běžném rozšíření g++)
[=, this]jako lambda capture[14]- šablony se seznamem parametrů pro lambda funkce[15]
- třícestné porovnání s použitím
operator <=>, který je podle svého vzhledu nazývaný „kosmická loď“ - inicializace dalších proměnných ve
forcyklu přes rozsah[16] - lambda funkce v neevaluovaných kontextech[17][18]
- implicitní konstruovatelné a přiřaditelné bezstavové lambda funkce[17][19]
- umožnění expanze balíčku parametrů zadaných jedním argumentem v lambda init-capture[17][20]
- typy třídy v netypových parametrech šablony; umožnění řetězcových literálů na místě parametrů šablon[21]
- odstranění potřeby
typenamev určitých místech[22] - nové standardní atributy
[[no_unique_address]],[23][[likely]]a[[unlikely]][24] - podmíněný modifikátor
explicitzávislý na logickém výrazu[25] - rozšířené
constexprna virtuální funkce,[26]union,[27]tryacatch,[28]dynamic_castatypeid,[29]std::pointer_traits[30] - bezprostřední funkce používající nové klíčové slovo
consteval[31] - celá čísla se znaménkem jsou nyní definována tak, že jsou reprezentována pomocí dvojkového doplňku (přetečení při výpočtu s celými čísly se znaménkem zůstává nedefinovaným chováním)[32]
- upravený paměťový model[33]
- různé vylepšení strukturovaných vazeb (interakce s lambda captures, třídy paměti
staticathread_local)[34][35] - korutiny[36]
usingnaenumvýčty s rozsahem platnosti[37]- klíčové slovo
constinit[38]
Knihovna
- rozsahy (podle One Ranges Proposal)[39]
std::make_sharedastd::allocate_sharedpro pole[40]- atomické chytré ukazatele (např.
std::atomic<shared_ptr<T>>astd::atomic<weak_ptr<T>>)[41] std::to_addresspro konverzi ukazatelů na syrový ukazatel[42]- doplňky pro práci s kalendářem a časovými zónami v
<chrono>[43] std::spanposkytující pohled na souvislá pole (podobnýstd::string_views možností, abyspanmodifikoval referencovanou posloupnost)[44]std::eraseastd::erase_ifpro zjednodušení rušení prvků ve většině standardních kontejnerů[45]- hlavičkový soubor
<version>[46] std::bit_cast<>pro změnu typové reprezentace objektu, méně upovídané nežmemcpy()a schopnější využívat vnitřní vlastnosti překladače[47]- makra pro testování rysů (features)[48]
- doplnění chybějících
constexprna různých místech v knihovně[49] - vytváření chytrých ukazatelů s implicitní inicializací[50]
- metoda
containspro asociativní kontejnery[51] - bitové operace, např. pro počet úvodních nul nebo jedniček,[52] a log2 operace[53][54][55]
std::bind_front[56]
Nová a změněná klíčová slova
Bylo přidáno mnoho nových klíčových slov (a nový operátor „kosmické lodi“, operator <=>), např. concept, constinit,[38] consteval, co_await, co_return, co_yield, requires (a změněn význam slova export), a char8_t (pro podporu UTF-8).[57] explicit může od C++20 používat výraz.[58] Většina použití klíčového slova volatile je nedoporučovaná.[59]
Kromě nových klíčových slov byly zavedeny identifikátory se speciálním významem, včetně import a module.
Nové atributy v C++20:
[[likely]], [[unlikely]] a [[no_unique_address]][60]
Odstraněné a nedoporučované vlastnosti
Odstraněné vlastnosti:[61]
- Hlavičkové soubory převzaté z jazyka C
<ccomplex>,<ciso646>,<cstdalign>,<cstdbool>a<ctgmath>byly odstraněny, protože v C++ nemají smysl. (Odpovídající hlavičkové soubory<*.h>zůstávají pro kompatibilitu s jazykem C.) - Použití
throw()jako specifikace výjimky bylo odstraněno. - Byly odstraněny některé dříve nedoporučované vlastnosti knihovny, mj.
std::uncaught_exception,std::raw_storage_iterator,std::is_literal_type,std::is_literal_type_v,std::result_ofastd::result_of_t.
Nedoporučované vlastnosti:
Remove ads
Publikováno jako Technické specifikace (TS)
Odloženo do pozdějších verzí
- Byla založena nová studijní skupina (SG21) pro práci na novém návrhu kontraktů[66]
- Reflexe[67][68]
- Metaclasses[69]
- Exekutory[70]
- Síťová rozšíření,[71][72] včetně asynchronních operací, základní V/V služby, časovače, buffery a proudy pracující s buffery, sokety a internetovými protokoly (blokované exekutory)
- Vlastnosti[73]
- Rozšířeny futures[74]
Podpora překladačů
Plný podpora[75]
- Visual Studio 2019 podporuje od verze 16.10.0 všechny vlastnosti C++20 při použití volby
/std:c++latest.[76] Volba/std:c++20povolující režim C++20 byla přidána ve verzi 16.11.0.[77][78]
Překladač Microsoftu podporuje nejen Windows, ale také Linux, Android a iOS. Pro vývoj v Linuxu však vyžaduje rozšíření „Visual C++ for Linux Development“.[79]
Částečný
- Clang má částečnou podporu C++20, kterou lze povolit volbou
-std=c++20(od verze 10) nebo-std=c++2a(do verze 9).[80] - Překladač EDG začal implementovat vlastnosti C++20 ve verzi 5.0 a od verze 6.1 podporuje většinu jazykových vlastností jádra C++20.[81]
- GCC má částečnou, experimentální podporu C++20 od roku 2017[82] ve verzi 8 volba
-std=c++2a. Stejně jako Clang nahradilo GCC ve verzi 10 tuto volbu volbou-std=c++20. Existuje také volba pro povolení GNU rozšíření kromě experimentální podpory C++20,-std=gnu++20.[83]
Remove ads
Historie
Změny provedené v pracovní verzi C++20 v červenci 2017 (Toronto) zahrnují:[84]
- koncepty (do normy se dostala ořezaná verze; označovaná jako „Concepts Lite“[85])
- pojmenované inicializátory
[=, this]jako lambda capture- šablony se seznamem parametrů pro lambda funkce
std::make_sharedastd::allocate_sharedpro pole
Změny provedené v pracovní verzi C++20 na podzimním zasedání v listopadu 2017 v Albuquerque zahrnují:[86][87]
- trojcestné porovnání pomocí operátoru „kosmické lodi“
operator <=> - inicializace další proměnné ve
forcyklu přes rozsah - lambda funkce v neevaluovaných kontextech
- implicitní konstruovatelné a přiřaditelné bezstavové lambda funkce
- umožnění expanze balíčku parametrů zadaných jedním argumentem v lambda init-capture
- řetězcové literály jako parametry šablon
- atomické chytré ukazatele (např.
std::atomic<shared_ptr<T>>astd::atomic<weak_ptr<T>>) std::to_addresspro konvertování ukazatelů na syrový ukazatel
Změny provedené v pracovní verzi C++20 v březnu 2018 v Jacksonville zahrnují:[88]
- odstranění potřeby
typenamev určitých místech - nové standardní atributy
[[no_unique_address]],[[likely]]a[[unlikely]] - doplňky kalendáře a časových zón v
<chrono> std::spanumožňuje pohledy na souvislé pole (podobně jakostd::string_viewalespanmůže referencovanou posloupnost modifikovat)- hlavičkový soubor
<version>
Změny provedené v pracovní verzi C++20 na letním zasedání v červnu 2018 v Rapperswilu zahrnují:[89]
kontrakty(později odložené do pozdější verze)[90]- makra pro testy rysů
std::bit_cast<>pro změnu typové reprezentace objektu, méně upovídané nežmemcpy()a schopnější využívat vnitřní vlastnosti překladače- podmíněné
explicit, umožňuje explicitní modifikátor závislý na logickém výrazu constexprvirtuální funkce
Změny provedené v pracovní verzi C++20 na podzimním zasedání v listopadu 2018 (San Diego) zahrnují:[91]
- rozsahy (The One Ranges Proposal)
- stručná syntaxe konceptů
constexprunion,tryacatch,dynamic_cast,typeidastd::pointer_traits.- přidání různých
constexprdo knihovny - bezprostřední funkce používající nové klíčové slovo
consteval - Celá čísla se znaménkem jsou nyní definována tak, že jsou reprezentována pomocí dvojkového doplňku (přetečení při výpočtu s celými čísly se znaménkem zůstává nedefinovaným chováním)
zjemnění nástrojů pro kontrakty (řízení přístupu v podmínkách kontraktu)[92] (viz seznam vlastností odložených do pozdějších verzí)- upravený paměťový model
- vytvoření chytrých ukazatelů s implicitní inicializací
Změny provedené v pracovní verzi C++20 při zimním zasedání v únoru 2019 (Kona) zahrnují:[93][94][95]
- korutiny
- moduly
- různá vylepšení strukturovaných vazeb (interakce s lambda captures, třídy paměti
staticathread_local)
Změny provedené v pracovní verzi C++20 na letním zasedání v červenci 2019 (Kolín nad Rýnem) zahrnují:[96][97][98][99]
- kontrakty byly odstraněny (viz seznam vlastností odložených do pozdějších verzí)[100]
- použití operátoru čárky ve výrazech v indexu je nedoporučované[62]
- doplňky
constexpr(triviální implicitní inicializace,[101] neevaluovaná inline montáž[102]) usingnaenumvýčty s rozsahem platnosti[37]- různé změny operátoru
<=>[103][104] - DR: menší změny modulů[105]
- klíčové slovo
constinit - změny v konceptech (odstranění
-> Typepožadavků na návratový typ[106]) - většina použití
volatileje nedoporučovaná[59] - DR:
[[nodiscard]]efekty na konstruktory[107] - Nové koncepty ve standardní knihovně nebudou používat PascalCase (ale
standard_case, jako zbytek standardní knihovny)[108] - formátování textu (
std::format, [109][110]chronointegrace,[111] oprava mezních případů vprintf[112]) - bitové operace[52]
constexpr INVOKE[113]- matematické konstanty[114]
- doplňky konzistence k atomic (
std::atomic_ref<T>,[115]std::atomic<std::shared_ptr<T>>[116]) - do standardní knihovny přidán operátor
<=>[117] - hlavičkové jednotky pro standardní knihovna[118]
- synchronizační nástroje[119] (sloučeny z: Efficient atomic waiting and semaphores,[120] latches and bariers,[121] Zlepšení
atomic_flag,[122] Don't Make C++ Unimplementable On Small CPUs[123]) std::source_location[124]constexprkontejnery (std::string,[125]std::vector[126])std::stop_tokena spojování vláken (std::jthread)[127]
Změny uplatněné při řešení připomínek NB na podzimním zasedání v listopadu 2019 (Belfast) zahrnují:[128][129][130][131]
- Typy tříd v parametrech netypové šablony (Non-Type Template Parameters, NTTP): Omezení, že není povolen žádný uživatelem definovaný
operator==bylo odstraněno, protože význam rovnosti argumentů šablony byl oddělen odoperator==.[132] Lze použít také pro prvky pole v NTTP typu třídy. - Typy s pohyblivou řádovou čárkou,[133] ukazatele a reference a sjednocení a třídy podobné sjednocení (typy tříd obsahující anonymní sjednocení) jsou nyní možné jako NTTP.
- Identita funkcí nyní zahrnuje také koncové klauze requires (P1971)
- Omezené funkce, které nejsou šablonami, byly odstraněny
<compare>je nyní dostupné v samostatné implementaci[134]- typedef
std::spanbyl změněn zindex_typenasize_type, aby byl konzistentní se zbytkem standardní knihovny[135] - Konceptové rysy byly přejmenovány, aby odpovídaly přejmenování konceptů, jak bylo schváleno na zasedání v Kolíně nad Rýnem
- Několik oprav a doplňků rozsahů (P1456R1: pohledy prouze pro přesun,[136] P1391R4: konstruktor rozsahu pro
std::string_view(konstruktor z dvojice iterátorů znaků),[137] P1394R4: konstruktor rozsahu prostd::span<ref>,[138] P1870R1: forwardování rozsahu<T> je příliš křehké[139]) - Inicializace
std::atomic<T>byla změněna, aby fungovala s implicitní inicializací a seznamovou inicializací,[140]std::latchastd::barriermohou nyní zjistit maximální počet vláken, které implementace podporuje pomocí nové členské funkcemax() std::weak_equalityastd::strong_equalitybyly odstraněny, protože nejsou vůbec používány- Algoritmům v
<numeric>bylo doplněnoconstexpr - Chybějící makra pro test rysů pro vlastnosti nové nebo změněné v C++20 byla doplněna[141]
Remove ads
Odkazy
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads