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.
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 () v březnu 2017. Tento DIS byl jednohlasně schválen, pouze s redakčními připomínkami, a závěrečný standard byl publikován v prosinci 2017. 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 je nyní nepovinná V parametru šablony lze použít (jako alternativu ke ) Nová pravidla pro vyvozování typu ze seznamu inicializátorů uvedených ve složených závorkách Vnořené definice jmenných prostorů, např. místo Povolení atributů pro jmenné prostory a výčtové typy Nové standardní atributy , a Znakové literály v kódování UTF-8 () (ř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ě Použití klíčového slova jako typu pro netypové parametry šablon Vyhodnocování konstant pro všechny netypové argumenty šablony Opakované použití operátoru () na parametr reprezentující proměnný počet argumentů variadické šablony: template<typename... Values> auto sum(Values const&... values) { return (values + ...); // Vrátí součet všech argumentů }
Statické v době překladu ve tvaru Strukturované deklarace vazeb, které umožňují Inicializátory v příkazech a Kopírovací inicializace a přímá inicializace objektů typu z čistě hodnotových () výrazů typu (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 Vyvozování argumentů šablon tříd (), zavedením průvodců vyvozování konstruktorů, např. umožnění místo vyžadování explicitních typů argumentů konstruktoru nebo dodatečné pomocné šablony funkce . 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 umožňující testovat dostupnost hlavičkového souboru direktivami preprocesoru Hodnota změněna na Specifikace výjimek se staly součástí typu funkce Lambda výrazy mohou zachycovat *this podle hodnoty
Knihovna Doplněna téměř celá knihovna Library Fundamentals TS I, mimo jiné: std::string_view, reference na textové řetězce a jejich části pro operace čtení 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 Nové vkládací funkce try_emplace a insert_or_assign pro std::map a std::unordered_map asociativní datové struktury klíč-hodnota Uniformní přístup ke kontejnerům: std::size, std::empty a std::data Definice „souvislých iterátorů“ Knihovna pro souborový systém založený na boost::filesystem Paralelní verze STL algoritmů Další matematické speciální funkce včetně eliptických integrálů a Besselových funkcí Kontejner std::variant pro variantní struktury Typ std::byte sloužící k reprezentaci surových datových bajtů, nikoli znaků nebo čísel Logické operátory definované v <type_traits> std::conjunction, std::disjunction a std::negation 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
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.IBM comment on preparing for a Trigraph-adverse future in C++17 , IBM paper N4210, 2014-10-10. Authors: Michael Wong, Hubert Tong, Rajan Bhakta, Derek Inglis 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í, 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 používané jako specifikátor úložného prostoru není použito. 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. Clang podporuje všechny vlastnosti jazyka C++17 od verze 5. Microsoft Visual Studio podporuje všechny vlastnosti jazyka C++17 od verze 15.8 (MSVC 19.15).
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) Částečná podpora C++17 je v libc++ od verze 9, zbytek je „ve vývoji“ 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
Odkazy Reference
Kategorie:C++ Kategorie:Standardy IEC Kategorie:Standardy ISO