Přeskočit na obsah

C++17

Z Wikipedie, otevřené encyklopedie
Verze jazyka C++

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.

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

  • 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]

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]

V tomto článku byl použit překlad textu z článku C++17 na anglické Wikipedii.

  1. 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. 
  2. ISO/IEC DIS 14882: Programming Languages — C++ [online]. Dostupné v archivu pořízeném dne 2017-03-25. 
  3. 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. 
  4. ISO/IEC 14882:2017 [online]. [cit. 2017-12-03]. Dostupné v archivu pořízeném z originálu dne 2013-01-29. 
  5. 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. 
  6. 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. 
  7. 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. 
  8. 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. 
  9. 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. 
  10. 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. 
  11. 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. 
  12. 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. 
  13. 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. 
  14. 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. 
  15. 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. 
  16. 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. 
  17. 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. 
  18. 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. 
  19. BOCCARA, Jonathan. C++ Fold Expressions 101 [online]. 2021-03-12 [cit. 2024-12-27]. Dostupné online. 
  20. 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. 
  21. 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. 
  22. Selection statements with initializer [online]. [cit. 2018-10-09]. Dostupné v archivu pořízeném z originálu dne 2017-10-06. 
  23. 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. 
  24. Class template argument deduction [online]. [cit. 2019-01-30]. Dostupné v archivu pořízeném z originálu dne 2019-01-31. 
  25. 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. 
  26. 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. 
  27. 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. 
  28. 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. 
  29. 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. 
  30. 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. 
  31. Current Status [online]. Dostupné v archivu pořízeném z originálu dne 2020-09-08. 
  32. 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. 
  33. 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. 
  34. 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. 
  35. 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. 
  36. 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. 
  37. N4284: Contiguous Iterators (Jens Maurer) [online]. [cit. 2014-11-15]. Dostupné v archivu pořízeném z originálu dne 2014-11-29. 
  38. Filesystem Library Proposal (Beman Dawes) [online]. [cit. 2015-12-12]. Dostupné v archivu pořízeném z originálu dne 2016-07-20. 
  39. The Parallelism TS Should be Standardized [online]. [cit. 2016-03-23]. Dostupné v archivu pořízeném z originálu dne 2016-04-05. 
  40. 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. 
  41. 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. 
  42. A byte type definition [online]. [cit. 2017-03-25]. Dostupné v archivu pořízeném z originálu dne 2017-03-25. 
  43. 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. 
  44. 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. 
  45. 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. 
  46. 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
  47. 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. 
  48. C++ Keywords: register [online]. [cit. 2018-09-03]. Dostupné v archivu pořízeném z originálu dne 2018-09-03. 
  49. 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. 
  50. 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. 
  51. 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. 
  52. 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. 
  53. Chapter 1. Status [online]. gcc.gnu.org [cit. 2018-06-19]. Dostupné v archivu pořízeném z originálu dne 2018-06-04. 
  54. libc++ C++17 Status [online]. llvm.org [cit. 2019-05-24]. Dostupné v archivu pořízeném z originálu dne 2019-05-24. 
  55. 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.