C++20
verze standardu popisujícího programovací jazyk C++, vydaná roku 2020 From Wikipedia, the free encyclopedia
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]
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
for
cyklu 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
typename
v určitých místech[22] - nové standardní atributy
[[no_unique_address]]
,[23][[likely]]
a[[unlikely]]
[24] - podmíněný modifikátor
explicit
závislý na logickém výrazu[25] - rozšířené
constexpr
na virtuální funkce,[26]union
,[27]try
acatch
,[28]dynamic_cast
atypeid
,[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
static
athread_local
)[34][35] - korutiny[36]
using
naenum
výčty s rozsahem platnosti[37]- klíčové slovo
constinit
[38]
Knihovna
- rozsahy (podle One Ranges Proposal)[39]
std::make_shared
astd::allocate_shared
pro pole[40]- atomické chytré ukazatele (např.
std::atomic<shared_ptr<T>>
astd::atomic<weak_ptr<T>>
)[41] std::to_address
pro konverzi ukazatelů na syrový ukazatel[42]- doplňky pro práci s kalendářem a časovými zónami v
<chrono>
[43] std::span
poskytující pohled na souvislá pole (podobnýstd::string_view
s možností, abyspan
modifikoval referencovanou posloupnost)[44]std::erase
astd::erase_if
pro 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
constexpr
na různých místech v knihovně[49] - vytváření chytrých ukazatelů s implicitní inicializací[50]
- metoda
contains
pro 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_of
astd::result_of_t
.
Nedoporučované vlastnosti:
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++20
povolují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]
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_shared
astd::allocate_shared
pro 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
for
cyklu 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_address
pro 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
typename
v 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::span
umožňuje pohledy na souvislé pole (podobně jakostd::string_view
alespan
můž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 constexpr
virtuá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ů
constexpr
union
,try
acatch
,dynamic_cast
,typeid
astd::pointer_traits
.- přidání různých
constexpr
do 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
static
athread_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]) using
naenum
výč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í
-> Type
požadavků na návratový typ[106]) - většina použití
volatile
je 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]chrono
integrace,[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]constexpr
kontejnery (std::string
,[125]std::vector
[126])std::stop_token
a 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::span
byl změněn zindex_type
nasize_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::latch
astd::barrier
mohou nyní zjistit maximální počet vláken, které implementace podporuje pomocí nové členské funkcemax()
std::weak_equality
astd::strong_equality
byly 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]
Odkazy
Wikiwand - on
Seamless Wikipedia browsing. On steroids.