For faster navigation, this Iframe is preloading the Wikiwand page for C++17.

C++17

This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article may require cleanup to meet Wikipedia's quality standards. The specific problem is: Article reads like a changelog. Please help improve this article if you can. (February 2023) (Learn how and when to remove this message) This article is in list format but may read better as prose. You can help by converting this article, if appropriate. Editing help is available. (February 2023) (Learn how and when to remove this message)

C++17 is a version of the ISO/IEC 14882 standard for the C++ programming language. C++17 replaced the prior version of the C++ standard, called C++14, and was later replaced by C++20.

History

Before the C++ Standards Committee fixed a 3-year release cycle, C++17's release date was uncertain. In that time period, the C++17 revision was also called C++1z, following C++0x or C++1x for C++11 and C++1y for C++14. The C++17 specification reached the Draft International Standard (DIS) stage in March 2017.[1][2] This DIS was unanimously approved, with only editorial comments,[3] and the final standard was published in December 2017.[4] Few changes were made to the C++ Standard Template Library, although some algorithms in the <algorithm> header were given support for explicit parallelization and some syntactic enhancements were made.

New features

C++17 introduced many new features. The following lists may be incomplete.

Language

  • Making the text message for static_assert optional[5]
  • Allow typename (as an alternative to class) in a template template parameter[6]
  • New rules for auto deduction from braced-init-list[7][8]
  • Nested namespace definitions, e.g., namespace X::Y { } instead of namespace X { namespace Y { } }[8][9]
  • Allowing attributes for namespaces and enumerators[10][11]
  • New standard attributes [[fallthrough]], [[maybe_unused]] and [[nodiscard]][12]
  • UTF-8 (u8) character literals[10][13] (UTF-8 string literals have existed since C++11; C++17 adds the corresponding character literals for consistency, though as they are restricted to a single byte they can only store "Basic Latin" and C0 control codes, i.e. ASCII)
  • Hexadecimal floating-point literals[14][15]
  • Use of auto as the type for a non-type template parameter[16]
  • Constant evaluation for all non-type template arguments[10][17]
  • Fold expressions, for variadic templates[10][18]
  • A compile-time static if with the form if constexpr(expression)[19]
  • Structured binding declarations, allowing auto [a, b] = getTwoReturnValues();[20]
  • Initializers in if and switch statements[21]
  • copy-initialization and direct-initialization of objects of type T from prvalue expressions of type T (ignoring top-level cv-qualifiers) shall result in no copy or move constructors from the prvalue expression. See copy elision for more information.
  • Some extensions on over-aligned memory allocation[22]
  • Class template argument deduction (CTAD), introducing constructor deduction guides, e.g. allowing std::pair(5.0, false) instead of requiring explicit constructor arguments types std::pair<double, bool>(5.0, false) or an additional helper template function std::make_pair(5.0, false).[23][24]
  • Inline variables, which allows the definition of variables in header files without violating the one definition rule. The rules are effectively the same as inline functions
  • __has_include, allowing the availability of a header to be checked by preprocessor directives[25]
  • Value of __cplusplus changed to 201703L[26]
  • Exception specifications were made part of the function type[27]
  • Lambda expressions can capture "*this" by value[28]

Library

Removed features

This revision of C++ not only added new features but also removed a few.

  • Trigraphs were removed.[44][45]
  • Some deprecated types and functions were removed from the standard library, including std::auto_ptr, std::random_shuffle, and old function adaptors.[8][46] These were superseded in C++11 by improved facilities such as std::unique_ptr, std::shuffle, std::bind, and lambdas.
  • The (formerly deprecated) use of the keyword register as a storage class specifier was removed.[47] This keyword is still reserved but now unused.

Compiler support

  • GCC has had complete support for C++17 language features since version 8.[48]
  • Clang 5 and later supports all C++17 language features.[49]
  • Visual Studio 2017 15.8 (MSVC 19.15) and later supports all C++17 language features.[50][51]

Library support

  • libstdc++ since version 9.1 has complete support for C++17 (8.1 without Parallelism TS and referring to C99 instead of C11) [52]
  • libc++ as of version 9 has partial support for C++17, with the remainder "in progress" [53]
  • Visual Studio 2017 15.8 (MSVC 19.15) Standard Library and later supports all C++17 library features except for "Elementary String Conversions" and referring to C99 instead of C11. "Elementary String Conversions" is added in Visual Studio 2019 16.4[54]

See also

References

  1. ^ "N4661 Editors' Report -- Programming Languages -- C++". 21 March 2017. Archived from the original on 2020-02-04. Retrieved 2017-03-21.
  2. ^ "ISO/IEC DIS 14882: Programming Languages — C++" (PDF). Archived from the original (PDF) on 2017-03-25.
  3. ^ Herb Sutter (6 September 2017). "C++17 is formally approved". Archived from the original on 29 January 2020. Retrieved 12 September 2017.
  4. ^ "ISO/IEC 14882:2017". Archived from the original on 2013-01-29. Retrieved 2017-12-03.
  5. ^ "N3928: Extending static_assert, v2 (Walter E. Brown)" (PDF). Archived (PDF) from the original on 2015-08-11. Retrieved 2015-04-03.
  6. ^ "N4051: Allow typename in a template template parameter (Richard Smith)". Archived from the original on 2015-08-11. Retrieved 2015-04-03.
  7. ^ "N3922: New Rules for auto deduction from braced-init-list (James Dennett)". Archived from the original on 2015-08-10. Retrieved 2014-11-28.
  8. ^ a b c "Updates to my trip report". Archived from the original on 2015-03-19. Retrieved 2014-11-28.
  9. ^ "N4230: Nested namespace definition (Robert Kawulak, Andrew Tomazos)". Archived from the original on 2015-08-03. Retrieved 2014-11-28.
  10. ^ a b c d e "New core language papers adopted for C++17". Archived from the original on 2015-04-27. Retrieved 2014-11-15.
  11. ^ "N4266: Attributes for namespaces and enumerators (Richard Smith)". Archived from the original on 2016-03-06. Retrieved 2014-11-15.
  12. ^ "N4640: Working Draft, Standard for Programming Language C++" (PDF). pp. 193–195. Archived (PDF) from the original on 2017-03-12. Retrieved 2017-03-09.
  13. ^ "N4267: Adding u8 character literals (Richard Smith)". Archived from the original on 2015-10-28. Retrieved 2014-11-15.
  14. ^ Thomas Köppe. "Hexadecimal floating literals for C++". Archived from the original on 2022-09-21. Retrieved 2017-07-16.
  15. ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §5.13.4. Archived (PDF) from the original on 2017-12-07. Retrieved 2017-03-24.
  16. ^ James Touton; Mike Spertus (2016-06-23). "Declaring non-type template parameters with auto". Archived from the original on 2017-09-16. Retrieved 2020-11-08.
  17. ^ "N4268: Allow constant evaluation for all non-type template arguments (Richard Smith)". Archived from the original on 2016-03-12. Retrieved 2014-11-15.
  18. ^ "N4295: Folding expressions (Andrew Sutton, Richard Smith)". Archived from the original on 2015-04-04. Retrieved 2014-11-15.
  19. ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §9.4.1. Archived (PDF) from the original on 2017-12-07. Retrieved 2017-03-24.
  20. ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §11.5. Archived (PDF) from the original on 2017-12-07. Retrieved 2017-03-24.
  21. ^ "Selection statements with initializer". Archived from the original on 2017-10-06. Retrieved 2018-10-09.
  22. ^ "Dynamic memory allocation for over-aligned data". Archived from the original on 2017-09-08. Retrieved 2017-03-13.
  23. ^ "Class template argument deduction". Archived from the original on 2019-01-31. Retrieved 2019-01-30.
  24. ^ "CppCon 2018: Timur Doumler "Class template argument deduction in C++17"". YouTube. Archived from the original on 2019-08-21. Retrieved 2019-01-30.
  25. ^ "N4640: Working Draft, Standard for Programming Language C++" (PDF). pp. 431–433. Archived (PDF) from the original on 2017-03-12. Retrieved 2017-03-09.
  26. ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §19.8. Archived (PDF) from the original on 2017-12-07. Retrieved 2017-03-24.
  27. ^ "P0012R1: Make exception specifications be part of the type system, version 5". Archived from the original on 2017-09-12. Retrieved 2018-12-17.
  28. ^ "P0018R3: Lambda Capture of *this by Value as [=,*this], version 3". Archived from the original on 2017-08-22. Retrieved 2021-06-21.
  29. ^ "Adopt Library Fundamentals V1 TS Components for C++17 (R1)". Archived from the original on 2016-04-05. Retrieved 2016-03-23.
  30. ^ "Current Status". Archived from the original on 2020-09-08.
  31. ^ "std::basic_string_view - cppreference.com". en.cppreference.com. Archived from the original on 2016-06-17. Retrieved 2016-06-23.
  32. ^ "N4259: Wording for std::uncaught_exceptions (Herb Sutter)" (PDF). Archived (PDF) from the original on 2014-11-29. Retrieved 2014-11-15.
  33. ^ "N4279: Improved insertion interface for unique-key maps (Thomas Köppe)". Archived from the original on 2015-04-27. Retrieved 2014-11-15.
  34. ^ a b c "New standard library papers adopted for C++17". Archived from the original on 2014-11-29. Retrieved 2014-11-15.
  35. ^ "N4280: Non-member size() and more (Riccardo Marcangelo)" (PDF). Archived (PDF) from the original on 2015-03-09. Retrieved 2014-11-15.
  36. ^ "N4284: Contiguous Iterators (Jens Maurer)". Archived from the original on 2014-11-29. Retrieved 2014-11-15.
  37. ^ "Filesystem Library Proposal (Beman Dawes)". Archived from the original on 2016-07-20. Retrieved 2015-12-12.
  38. ^ "The Parallelism TS Should be Standardized". Archived from the original on 2016-04-05. Retrieved 2016-03-23.
  39. ^ "Mathematical Special Functions for C++17, v5" (PDF). Archived (PDF) from the original on 2016-04-05. Retrieved 2016-03-23.
  40. ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §23.7. Archived (PDF) from the original on 2017-12-07. Retrieved 2017-03-24.
  41. ^ "A byte type definition" (PDF). Archived (PDF) from the original on 2017-03-25. Retrieved 2017-03-25.
  42. ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §23.15.8. Archived (PDF) from the original on 2017-12-07. Retrieved 2017-03-24.
  43. ^ "PMR (Polymorphic Memory Resources) fully described -- Nico Josuttis". Archived from the original on 2021-08-28. Retrieved 2020-11-16.
  44. ^ "N3981: Removing trigraphs??! (Richard Smith)". 2014-05-06. Archived from the original on 2018-07-09. Retrieved 2015-04-03.
  45. ^ IBM comment on preparing for a Trigraph-adverse future in C++17 Archived 2018-09-11 at the Wayback Machine, IBM paper N4210, 2014-10-10. Authors: Michael Wong, Hubert Tong, Rajan Bhakta, Derek Inglis
  46. ^ "N4190: Removing auto_ptr, random_shuffle(), And Old <functional> Stuff (Stephan T. Lavavej)". Archived from the original on 2017-10-20. Retrieved 2014-11-28.
  47. ^ "C++ Keywords: register". Archived from the original on 2018-09-03. Retrieved 2018-09-03.
  48. ^ "C++ Standards Support in GCC - GNU Project - Free Software Foundation (FSF)". gcc.gnu.org. Archived from the original on 2018-04-04. Retrieved 2018-04-03.
  49. ^ "Clang - C++17, C++14, C++11 and C++98 Status". clang.llvm.org. Archived from the original on 2013-07-04. Retrieved 2018-06-26.
  50. ^ corob-msft. "Visual C++ Language Conformance". docs.microsoft.com. Archived from the original on 2018-06-19. Retrieved 2018-06-19.
  51. ^ "Announcing: MSVC Conforms to the C++ Standard". 7 May 2018. Archived from the original on 2018-08-26. Retrieved 2018-05-08.
  52. ^ "Chapter 1. Status". gcc.gnu.org. Archived from the original on 2018-06-04. Retrieved 2018-06-19.
  53. ^ "libc++ C++17 Status". llvm.org. Archived from the original on 2019-05-24. Retrieved 2019-05-24.
  54. ^ "Announcing: MSVC Conforms to the C++ Standard". devblogs.microsoft.com. 7 May 2018. Archived from the original on 2018-08-26. Retrieved 2019-05-24.
{{bottomLinkPreText}} {{bottomLinkText}}
C++17
Listen to this article

This browser is not supported by Wikiwand :(
Wikiwand requires a browser with modern capabilities in order to provide you with the best reading experience.
Please download and use one of the following browsers:

This article was just edited, click to reload
This article has been deleted on Wikipedia (Why?)

Back to homepage

Please click Add in the dialog above
Please click Allow in the top-left corner,
then click Install Now in the dialog
Please click Open in the download dialog,
then click Install
Please click the "Downloads" icon in the Safari toolbar, open the first download in the list,
then click Install
{{::$root.activation.text}}

Install Wikiwand

Install on Chrome Install on Firefox
Don't forget to rate us

Tell your friends about Wikiwand!

Gmail Facebook Twitter Link

Enjoying Wikiwand?

Tell your friends and spread the love:
Share on Gmail Share on Facebook Share on Twitter Share on Buffer

Our magic isn't perfect

You can help our automatic cover photo selection by reporting an unsuitable photo.

This photo is visually disturbing This photo is not a good choice

Thank you for helping!


Your input will affect cover photo selection, along with input from other users.

X

Get ready for Wikiwand 2.0 🎉! the new version arrives on September 1st! Don't want to wait?