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]

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

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 a catch,[28] dynamic_cast a typeid,[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 a thread_local)[34][35]
  • korutiny[36]
  • using na enum výčty s rozsahem platnosti[37]
  • klíčové slovo constinit[38]

Knihovna

  • rozsahy (podle One Ranges Proposal)[39]
  • std::make_shared a std::allocate_shared pro pole[40]
  • atomické chytré ukazatele (např. std::atomic<shared_ptr<T>> a std::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í, aby span modifikoval referencovanou posloupnost)[44]
  • std::erase a std::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 a std::result_of_t.

Nedoporučované vlastnosti:

  • Použití operátoru čárka v indexových výrazech je nyní nedoporučované[62]
  • (Většina použití) volatile je nedoporučovaná[59]

Publikováno jako Technické specifikace (TS)

  • TS paralelismus v2[63] (včetně task bloků)
  • Reflexe TS v1[64]
  • TS sítě v1[65]

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 a std::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>> a std::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ě jako std::string_view ale span 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 a catch, dynamic_cast, typeid a std::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 a thread_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 na enum 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ů v printf[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 od operator==.[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 z index_type na size_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 pro std::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 a std::barrier mohou nyní zjistit maximální počet vláken, které implementace podporuje pomocí nové členské funkce max()
  • std::weak_equality a std::strong_equality byly odstraněny, protože nejsou vůbec používány
  • Algoritmům v <numeric> bylo doplněno constexpr
  • Chybějící makra pro test rysů pro vlastnosti nové nebo změněné v C++20 byla doplněna[141]

Odkazy

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.