C++17

verze standardu popisujícího programovací jazyk C++ vydaná roku 2017 From Wikipedia, the free encyclopedia

C++17 je verze normy ISO/IEC 14882 programovacího jazyka C++, která byla vydána v roce 2017. Nahradila předchozí verzi nazývanou C++14, a sama byla později nahrazena verzí C++20.

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

Historie

Než výbor pro normalizaci C++ stanovil tříletý cyklus vydávání, byl rok vydání C++17 nejistý. Proto se revize C++17 před svým vydáním označovala také C++1z, jako verze následující po C++0x, C++1x (předběžné označení pro C++11) a C++1y (tj. C++14). Specifikace C++17 se dostala do fáze návrhu mezinárodní normy (anglicky Draft International Standard, DIS) v březnu 2017.[1][2] Tento DIS byl jednohlasně schválen, pouze s redakčními připomínkami,[3] a závěrečný standard byl publikován v prosinci 2017.[4] Ve Standard Template Library bylo provedeno jen málo změn; některé algoritmy v hlavičkovém souboru <algorithm> získaly podporu pro explicitní paralelizaci a byla provedena některá syntaktická vylepšení.

Nové vlastnosti

Ve verzi C++17 bylo zavedeno mnoho nových vlastností. Následující seznam nemusí být úplný.

Jazyk

  • Textová zpráva pro static_assert je nyní nepovinná[5]
  • V parametru šablony lze použít typename (jako alternativu ke class)[6]
  • Nová pravidla pro vyvozování typu auto ze seznamu inicializátorů uvedených ve složených závorkách[7][8]
  • Vnořené definice jmenných prostorů, např. namespace X::Y { … } místo namespace X { namespace Y { … } }[8][9]
  • Povolení atributů pro jmenné prostory a výčtové typy[10][11]
  • Nové standardní atributy [[fallthrough]], [[maybe_unused]] a [[nodiscard]][12]
  • Znakové literály v kódování UTF-8 (u8)[10][13] (řetězcové literály v UTF-8 existují od C++11; C++17 přidává z důvodu konzistence odpovídající znakové literály, které jsou však omezené na jediný byte, takže mohou pouze obsahovat ASCII znaky)
  • Číselné literály s pohyblivou řádovou čárkou v šestnáctkové soustavě[14][15]
  • Použití klíčového slova auto jako typu pro netypové parametry šablon[16]
  • Vyhodnocování konstant pro všechny netypové argumenty šablony[10][17]
  • Opakované použití operátoru (anglicky fold expression) na parametr reprezentující proměnný počet argumentů variadické šablony:[10][18][19]
    template<typename... Values>
    auto sum(Values const&... values)
    {
        return (values + ...); // Vrátí součet všech argumentů
    }
    
  • Statické if v době překladu ve tvaru if constexpr(expression)[20]
  • Strukturované deklarace vazeb, které umožňují auto [a, b] = getTwoReturnValues();[21]
  • Inicializátory v příkazech if a switch[22]
  • Kopírovací inicializace a přímá inicializace objektů typu T z čistě hodnotových (anglicky prvalue) výrazů typu T (bez ohledu na cv-kvalifikátory nejvyšší úrovně) nevyvolá kopírovací nebo přesunový konstruktor na čistě hodnotový výraz. Další informace jsou v článku vypuštění kopírování.
  • Některá rozšíření týkající se příliš zarovnaného přidělování paměti[23]
  • Vyvozování argumentů šablon tříd (anglicky Class template argument deduction, CTAD), zavedením průvodců vyvozování konstruktorů, např. umožnění std::pair(5.0, false) místo vyžadování explicitních typů argumentů konstruktoru std::pair<double, bool>(5.0, false) nebo dodatečné pomocné šablony funkce std::make_pair(5.0, false).[24][25]
  • Inline proměnné, který umožňují definice proměnných v hlavičkových souborech bez porušení pravidla jedné definice. Pravidla jsou v zásadě stejná jako pro inline funkce
  • __has_include umožňující testovat dostupnost hlavičkového souboru direktivami preprocesoru[26]
  • Hodnota __cplusplus změněna na 201703L[27]
  • Specifikace výjimek se staly součástí typu funkce[28]
  • Lambda výrazy mohou zachycovat *this podle hodnoty[29]

Knihovna

  • Doplněna téměř celá knihovna Library Fundamentals TS I, mimo jiné:[30][31]
    • std::string_view, reference na textové řetězce a jejich části pro operace čtení[32]
    • std::optional, pro reprezentaci nepovinných objektů, umožňuje, aby algoritmus někdy vracel určitý datový typ a někdy nevracel nic
    • typ std::any odkazující se na jednu hodnotu libovolného typu
  • std::uncaught_exceptions, jako náhrada za std::uncaught_exception při zpracování výjimek[33][10]
  • Nové vkládací funkce try_emplace a insert_or_assign pro std::map a std::unordered_map asociativní datové struktury klíč-hodnota[34][35]
  • Uniformní přístup ke kontejnerům: std::size, std::empty a std::data[35][36]
  • Definice „souvislých iterátorů[35][37]
  • Knihovna pro souborový systém založený na boost::filesystem[38]
  • Paralelní verze STL algoritmů[39]
  • Další matematické speciální funkce včetně eliptických integrálů a Besselových funkcí[40]
  • Kontejner std::variant pro variantní struktury[41]
  • Typ std::byte sloužící k reprezentaci surových datových bajtů, nikoli znaků nebo čísel[42]
  • Logické operátory definované v <type_traits> std::conjunction, std::disjunction a std::negation[43] pro vytváření logických podmínek při testování typů při metaprogramování.
  • Hlavičkový soubor <memory_resource> pro polymorfní paměťové prostředky[44]

Odstraněné vlastnosti

Tato revize C++ nejen zavedla nové vlastnosti, ale některé vlastností také odstranila.

  • Možnost zápisu speciálních znaků pomocí trigrafů byla odstraněna.[45][46]
  • Ze standardní knihovny byly odstraněny některé nedoporučované typy a funkce, včetně std::auto_ptr, std::random_shuffle, a starých adaptérů funkcí,[8][47] které byly v C++11 nahrazeny novější verzí s vylepšenými nástroji např. std::unique_ptr, std::shuffle, std::bind a lambda funkcemi.
  • Již dříve nedoporučované klíčové slovo register používané jako specifikátor úložného prostoru není použito.[48] Stále jdo o rezervované slovo, ale není použité.

Podpora v překladačích

  • GCC má úplnou podporu jazykových vlastností C++17 od verze 8.[49]
  • Clang podporuje všechny vlastnosti jazyka C++17 od verze 5.[50]
  • Microsoft Visual Studio podporuje všechny vlastnosti jazyka C++17 od verze 15.8 (MSVC 19.15).[51][52]

Podpora knihoven

  • Úplná podpora C++17 je v libstdc++ od verze 9.1 (od verze 8.1 bez paralelismu TS a odkazuje se na C99 místo C11)[53]
  • Částečná podpora C++17 je v libc++ od verze 9, zbytek je „ve vývoji“ [54]
  • Standardní knihovna v Microsoft Visual Studio 15.8 (MSVC 19.15) podporuje všechny vlastnosti knihovny C++17 kromě „základních konverzí řetězců“ a odkazuje se na C99 místo C11. „Základní konverze řetězců“ byly doplněny v Microsoft Visual Studio 16.4[55]

Odkazy

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.