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 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
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
Reference
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.
|