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.
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 keclass
)[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ístonamespace 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 tvaruif constexpr(expression)
[20] - Strukturované deklarace vazeb, které umožňují
auto [a, b] = getTwoReturnValues();
[21] - Inicializátory v příkazech
if
aswitch
[22] - Kopírovací inicializace a přímá inicializace objektů typu
T
z čistě hodnotových (anglicky prvalue) výrazů typuT
(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ů konstruktorustd::pair<double, bool>(5.0, false)
nebo dodatečné pomocné šablony funkcestd::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 na201703L
[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 zastd::uncaught_exception
při zpracování výjimek[33][10]- Nové vkládací funkce
try_emplace
ainsert_or_assign
prostd::map
astd::unordered_map
asociativní datové struktury klíč-hodnota[34][35] - Uniformní přístup ke kontejnerům:
std::size
,std::empty
astd::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
astd::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
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
Wikiwand - on
Seamless Wikipedia browsing. On steroids.