C++17
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
[editovat | editovat zdroj]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
[editovat | editovat zdroj]Ve verzi C++17 bylo zavedeno mnoho nových vlastností. Následující seznam nemusí být úplný.
Jazyk
[editovat | editovat zdroj]- 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
[editovat | editovat zdroj]- 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
[editovat | editovat zdroj]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
[editovat | editovat zdroj]- 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
[editovat | editovat zdroj]- Ú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
[editovat | editovat zdroj]Reference
[editovat | editovat zdroj]V tomto článku byl použit překlad textu z článku C++17 na anglické Wikipedii.
- ↑ N4661 Editors' Report -- Programming Languages -- C++ [online]. 2017-03-21 [cit. 2017-03-21]. Dostupné v archivu pořízeném z originálu dne 2020-02-04.
- ↑ ISO/IEC DIS 14882: Programming Languages — C++ [online]. Dostupné v archivu pořízeném dne 2017-03-25.
- ↑ SUTTER, Herb. C++17 is formally approved [online]. 2017-09-06 [cit. 2017-09-12]. Dostupné v archivu pořízeném z originálu dne 2020-01-29.
- ↑ ISO/IEC 14882:2017 [online]. [cit. 2017-12-03]. Dostupné v archivu pořízeném z originálu dne 2013-01-29.
- ↑ N3928: Extending static_assert, v2 (Walter E. Brown) [online]. [cit. 2015-04-03]. Dostupné v archivu pořízeném z originálu dne 2015-08-11.
- ↑ N4051: Allow typename in a template template parameter (Richard Smith) [online]. [cit. 2015-04-03]. Dostupné v archivu pořízeném z originálu dne 2015-08-11.
- ↑ N3922: New Rules for auto deduction from braced-init-list (James Dennett) [online]. [cit. 2014-11-28]. Dostupné v archivu pořízeném z originálu dne 2015-08-10.
- ↑ a b c Updates to my trip report [online]. [cit. 2014-11-28]. Dostupné v archivu pořízeném z originálu dne 2015-03-19.
- ↑ N4230: Nested namespace definition (Robert Kawulak, Andrew Tomazos) [online]. [cit. 2014-11-28]. Dostupné v archivu pořízeném z originálu dne 2015-08-03.
- ↑ a b c d e New core language papers adopted for C++17 [online]. [cit. 2014-11-15]. Dostupné v archivu pořízeném z originálu dne 2015-04-27.
- ↑ N4266: Attributes for namespaces and enumerators (Richard Smith) [online]. [cit. 2014-11-15]. Dostupné v archivu pořízeném z originálu dne 2016-03-06.
- ↑ N4640: Working Draft, Standard for Programming Language C++ [online]. [cit. 2017-03-09]. S. 193–195. Dostupné v archivu pořízeném z originálu dne 2017-03-12.
- ↑ N4267: Adding u8 character literals (Richard Smith) [online]. [cit. 2014-11-15]. Dostupné v archivu pořízeném z originálu dne 2015-10-28.
- ↑ Thomas Köppe. Hexadecimal floating literals for C++ [online]. [cit. 2017-07-16]. Dostupné v archivu pořízeném z originálu dne 2022-09-21.
- ↑ N4659: Working Draft, Standard for Programming Language C++ [online]. [cit. 2017-03-24]. Kapitola §5.13.4. Dostupné v archivu pořízeném z originálu dne 2017-12-07.
- ↑ James Touton; Mike Spertus. Declaring non-type template parameters with auto [online]. 2016-06-23 [cit. 2020-11-08]. Dostupné v archivu pořízeném z originálu dne 2017-09-16.
- ↑ N4268: Allow constant evaluation for all non-type template arguments (Richard Smith) [online]. [cit. 2014-11-15]. Dostupné v archivu pořízeném z originálu dne 2016-03-12.
- ↑ N4295: Folding expressions (Andrew Sutton, Richard Smith) [online]. [cit. 2014-11-15]. Dostupné v archivu pořízeném z originálu dne 2015-04-04.
- ↑ BOCCARA, Jonathan. C++ Fold Expressions 101 [online]. 2021-03-12 [cit. 2024-12-27]. Dostupné online.
- ↑ N4659: Working Draft, Standard for Programming Language C++ [online]. [cit. 2017-03-24]. Kapitola §9.4.1. Dostupné v archivu pořízeném z originálu dne 2017-12-07.
- ↑ N4659: Working Draft, Standard for Programming Language C++ [online]. [cit. 2017-03-24]. Kapitola §11.5. Dostupné v archivu pořízeném z originálu dne 2017-12-07.
- ↑ Selection statements with initializer [online]. [cit. 2018-10-09]. Dostupné v archivu pořízeném z originálu dne 2017-10-06.
- ↑ Dynamic memory allocation for over-aligned data [online]. [cit. 2017-03-13]. Dostupné v archivu pořízeném z originálu dne 2017-09-08.
- ↑ Class template argument deduction [online]. [cit. 2019-01-30]. Dostupné v archivu pořízeném z originálu dne 2019-01-31.
- ↑ CppCon 2018: Timur Doumler "Class template argument deduction in C++17" [online]. YouTube [cit. 2019-01-30]. Dostupné v archivu pořízeném z originálu dne 2019-08-21.
- ↑ N4640: Working Draft, Standard for Programming Language C++ [online]. [cit. 2017-03-09]. S. 431–433. Dostupné v archivu pořízeném z originálu dne 2017-03-12.
- ↑ N4659: Working Draft, Standard for Programming Language C++ [online]. [cit. 2017-03-24]. Kapitola §19.8. Dostupné v archivu pořízeném z originálu dne 2017-12-07.
- ↑ P0012R1: Make exception specifications be part of the type system, version 5 [online]. [cit. 2018-12-17]. Dostupné v archivu pořízeném z originálu dne 2017-09-12.
- ↑ P0018R3: Lambda Capture of *this by Value as [=,*this], version 3 [online]. [cit. 2021-06-21]. Dostupné v archivu pořízeném z originálu dne 2017-08-22.
- ↑ Adopt Library Fundamentals V1 TS Components for C++17 (R1) [online]. [cit. 2016-03-23]. Dostupné v archivu pořízeném z originálu dne 2016-04-05.
- ↑ Current Status [online]. Dostupné v archivu pořízeném z originálu dne 2020-09-08.
- ↑ std::basic_string_view - cppreference.com [online]. en.cppreference.com [cit. 2016-06-23]. Dostupné v archivu pořízeném z originálu dne 2016-06-17.
- ↑ N4259: Wording for std::uncaught_exceptions (Herb Sutter) [online]. [cit. 2014-11-15]. Dostupné v archivu pořízeném z originálu dne 2014-11-29.
- ↑ N4279: Improved insertion interface for unique-key maps (Thomas Köppe) [online]. [cit. 2014-11-15]. Dostupné v archivu pořízeném z originálu dne 2015-04-27.
- ↑ a b c New standard library papers adopted for C++17 [online]. [cit. 2014-11-15]. Dostupné v archivu pořízeném z originálu dne 2014-11-29.
- ↑ N4280: Non-member size() and more (Riccardo Marcangelo) [online]. [cit. 2014-11-15]. Dostupné v archivu pořízeném z originálu dne 2015-03-09.
- ↑ N4284: Contiguous Iterators (Jens Maurer) [online]. [cit. 2014-11-15]. Dostupné v archivu pořízeném z originálu dne 2014-11-29.
- ↑ Filesystem Library Proposal (Beman Dawes) [online]. [cit. 2015-12-12]. Dostupné v archivu pořízeném z originálu dne 2016-07-20.
- ↑ The Parallelism TS Should be Standardized [online]. [cit. 2016-03-23]. Dostupné v archivu pořízeném z originálu dne 2016-04-05.
- ↑ Mathematical Special Functions for C++17, v5 [online]. [cit. 2016-03-23]. Dostupné v archivu pořízeném z originálu dne 2016-04-05.
- ↑ N4659: Working Draft, Standard for Programming Language C++ [online]. [cit. 2017-03-24]. Kapitola §23.7. Dostupné v archivu pořízeném z originálu dne 2017-12-07.
- ↑ A byte type definition [online]. [cit. 2017-03-25]. Dostupné v archivu pořízeném z originálu dne 2017-03-25.
- ↑ N4659: Working Draft, Standard for Programming Language C++ [online]. [cit. 2017-03-24]. Kapitola §23.15.8. Dostupné v archivu pořízeném z originálu dne 2017-12-07.
- ↑ PMR (Polymorphic Memory Resources) fully described -- Nico Josuttis [online]. [cit. 2020-11-16]. Dostupné v archivu pořízeném z originálu dne 2021-08-28.
- ↑ N3981: Removing trigraphs??! (Richard Smith) [online]. 2014-05-06 [cit. 2015-04-03]. Dostupné v archivu pořízeném z originálu dne 2018-07-09.
- ↑ IBM comment on preparing for a Trigraph-adverse future in C++17 Archivováno 12. 8. 2024 na Wayback Machine., IBM paper N4210, 2014-10-10. Authors: Michael Wong, Hubert Tong, Rajan Bhakta, Derek Inglis
- ↑ N4190: Removing auto_ptr, random_shuffle(), And Old <functional> Stuff (Stephan T. Lavavej) [online]. [cit. 2014-11-28]. Dostupné v archivu pořízeném z originálu dne 2017-10-20.
- ↑ C++ Keywords: register [online]. [cit. 2018-09-03]. Dostupné v archivu pořízeném z originálu dne 2018-09-03.
- ↑ C++ Standards Support in GCC - GNU Project - Free Software Foundation (FSF) [online]. gcc.gnu.org [cit. 2018-04-03]. Dostupné v archivu pořízeném z originálu dne 2018-04-04.
- ↑ Clang - C++17, C++14, C++11 and C++98 Status [online]. clang.llvm.org [cit. 2018-06-26]. Dostupné v archivu pořízeném z originálu dne 2013-07-04.
- ↑ COROB-MSFT. Visual C++ Language Conformance [online]. docs.microsoft.com [cit. 2018-06-19]. Dostupné v archivu pořízeném z originálu dne 2018-06-19.
- ↑ Announcing: MSVC Conforms to the C++ Standard [online]. 2018-05-07 [cit. 2018-05-08]. Dostupné v archivu pořízeném z originálu dne 2018-08-26.
- ↑ Chapter 1. Status [online]. gcc.gnu.org [cit. 2018-06-19]. Dostupné v archivu pořízeném z originálu dne 2018-06-04.
- ↑ libc++ C++17 Status [online]. llvm.org [cit. 2019-05-24]. Dostupné v archivu pořízeném z originálu dne 2019-05-24.
- ↑ Announcing: MSVC Conforms to the C++ Standard [online]. devblogs.microsoft.com, 2018-05-07 [cit. 2019-05-24]. Dostupné v archivu pořízeném z originálu dne 2018-08-26.