C++17 is a version of theISO/IEC 14882 standard for theC++ programming language. C++17 replaced the prior version of the C++ standard, calledC++14, and was later replaced byC++20.
History
editBefore 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 calledC++1z, following C++0x or C++1x forC++11 and C++1y forC++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 somealgorithms inthe<algorithm>
header were given support for explicitparallelization and somesyntactic enhancements were made.
New features
editC++17 introduced many new features. The following lists may be incomplete.
Language
edit- Making the text message for
static_assert
optional[5] - Allow
typename
(as an alternative toclass
) in a template template parameter[6] - New rules for
auto
deduction from braced-init-list[7][8] - Nested namespace definitions, e.g.,
namespaceX::Y{…}
instead ofnamespaceX{namespaceY{…}}
[8][9] - Allowing attributes fornamespaces andenumerators[10][11]
- New standard attributes
[[fallthrough]]
,[[maybe_unused]]
and[[nodiscard]]
[12] - UTF-8 (
u8
) character literals[10][13] (UTF-8 string literals have existed sinceC++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" andC0 control codes, i.e.ASCII) - Hexadecimalfloating-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, forvariadic templates[10][18]
- A compile-time static
if
with the formifconstexpr(expression)
[19] - Structured binding declarations, allowing
auto[a,b]=getTwoReturnValues();
[20] - Initializers in
if
andswitch
statements[21] - copy-initialization and direct-initialization of objects of type
T
from prvalue expressions of typeT
(ignoring top-level cv-qualifiers) shall result in no copy or move constructors from the prvalue expression. Seecopy 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 typesstd::pair<double,bool>(5.0,false)
or an additional helper template functionstd::make_pair(5.0,false)
.[23][24] - Inline variables, which allows the definition of variables in header files without violating theone definition rule. The rules are effectively the same asinline functions
__has_include
, allowing the availability of a header to be checked by preprocessor directives[25]- Value of
__cplusplus
changed to201703L
[26] - Exception specifications were made part of the function type[27]
- Lambda expressions can capture "
*this
" by value[28]
Library
edit- Most of Library Fundamentals TS I, including:[29][30]
std::string_view
, a read-only non-owning reference to a character sequence orstring-slice[31]std::optional
, for representingoptional objects, a data type that may not always be returned by a given algorithm with support for non-returnstd::any
, for holding single values of any type
std::uncaught_exceptions
, as a replacement ofstd::uncaught_exception
inexception handling[32][10]- New insertion functions
try_emplace
andinsert_or_assign
forstd::map
andstd::unordered_map
key-value associative data structures[33][34] - Uniformcontainer access:
std::size
,std::empty
andstd::data
[34][35] - Definition of "contiguousiterators"[34][36]
- Afile system library based on
boost::filesystem
[37] - Parallel versions ofSTL algorithms[38]
- Additional mathematicalspecial functions, includingelliptic integrals andBessel functions[39]
std::variant
, atagged union container[40]std::byte
, allowingchar to be replaced for data types intending to model abyte of data as a byte rather than a character[41]- Logical operator traits:
std::conjunction
,std::disjunction
andstd::negation
[42] <memory_resource>
header, for polymorphic memory resources[43]
Removed features
editThis 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 thestandard library, including
std::auto_ptr
,std::random_shuffle
, and old function adaptors.[8][46] These were superseded in C++11 by improved facilities such asstd::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 stillreserved but now unused.
Compiler support
editLibrary support
edit- 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 inVisual Studio 2019 16.4[54]
See also
editReferences
edit- ^"N4661 Editors' Report -- Programming Languages -- C++". 21 March 2017.Archived from the original on 2020-02-04. Retrieved2017-03-21.
- ^"ISO/IEC DIS 14882: Programming Languages — C++"(PDF). Archived fromthe original(PDF) on 2017-03-25.
- ^Herb Sutter (6 September 2017)."C++17 is formally approved".Archived from the original on 29 January 2020. Retrieved12 September 2017.
- ^"ISO/IEC 14882:2017".Archived from the original on 2013-01-29. Retrieved2017-12-03.
- ^"N3928: Extending static_assert, v2 (Walter E. Brown)"(PDF).Archived(PDF) from the original on 2015-08-11. Retrieved2015-04-03.
- ^"N4051: Allow typename in a template template parameter (Richard Smith)".Archived from the original on 2015-08-11. Retrieved2015-04-03.
- ^"N3922: New Rules for auto deduction from braced-init-list (James Dennett)".Archived from the original on 2015-08-10. Retrieved2014-11-28.
- ^abc"Updates to my trip report".Archived from the original on 2015-03-19. Retrieved2014-11-28.
- ^"N4230: Nested namespace definition (Robert Kawulak, Andrew Tomazos)".Archived from the original on 2015-08-03. Retrieved2014-11-28.
- ^abcde"New core language papers adopted for C++17".Archived from the original on 2015-04-27. Retrieved2014-11-15.
- ^"N4266: Attributes for namespaces and enumerators (Richard Smith)".Archived from the original on 2016-03-06. Retrieved2014-11-15.
- ^"N4640: Working Draft, Standard for Programming Language C++"(PDF). pp. 193–195.Archived(PDF) from the original on 2017-03-12. Retrieved2017-03-09.
- ^"N4267: Adding u8 character literals (Richard Smith)".Archived from the original on 2015-10-28. Retrieved2014-11-15.
- ^Thomas Köppe."Hexadecimal floating literals for C++".Archived from the original on 2022-09-21. Retrieved2017-07-16.
- ^"N4659: Working Draft, Standard for Programming Language C++"(PDF). §5.13.4.Archived(PDF) from the original on 2017-12-07. Retrieved2017-03-24.
- ^James Touton; Mike Spertus (2016-06-23)."Declaring non-type template parameters with auto".Archived from the original on 2017-09-16. Retrieved2020-11-08.
- ^"N4268: Allow constant evaluation for all non-type template arguments (Richard Smith)".Archived from the original on 2016-03-12. Retrieved2014-11-15.
- ^"N4295: Folding expressions (Andrew Sutton, Richard Smith)".Archived from the original on 2015-04-04. Retrieved2014-11-15.
- ^"N4659: Working Draft, Standard for Programming Language C++"(PDF). §9.4.1.Archived(PDF) from the original on 2017-12-07. Retrieved2017-03-24.
- ^"N4659: Working Draft, Standard for Programming Language C++"(PDF). §11.5.Archived(PDF) from the original on 2017-12-07. Retrieved2017-03-24.
- ^"Selection statements with initializer".Archived from the original on 2017-10-06. Retrieved2018-10-09.
- ^"Dynamic memory allocation for over-aligned data".Archived from the original on 2017-09-08. Retrieved2017-03-13.
- ^"Class template argument deduction".Archived from the original on 2019-01-31. Retrieved2019-01-30.
- ^"CppCon 2018: Timur Doumler "Class template argument deduction in C++17"".YouTube.Archived from the original on 2019-08-21. Retrieved2019-01-30.
- ^"N4640: Working Draft, Standard for Programming Language C++"(PDF). pp. 431–433.Archived(PDF) from the original on 2017-03-12. Retrieved2017-03-09.
- ^"N4659: Working Draft, Standard for Programming Language C++"(PDF). §19.8.Archived(PDF) from the original on 2017-12-07. Retrieved2017-03-24.
- ^"P0012R1: Make exception specifications be part of the type system, version 5".Archived from the original on 2017-09-12. Retrieved2018-12-17.
- ^"P0018R3: Lambda Capture of *this by Value as [=,*this], version 3".Archived from the original on 2017-08-22. Retrieved2021-06-21.
- ^"Adopt Library Fundamentals V1 TS Components for C++17 (R1)".Archived from the original on 2016-04-05. Retrieved2016-03-23.
- ^"Current Status".Archived from the original on 2020-09-08.
- ^"std::basic_string_view - cppreference.com".en.cppreference.com.Archived from the original on 2016-06-17. Retrieved2016-06-23.
- ^"N4259: Wording for std::uncaught_exceptions (Herb Sutter)"(PDF).Archived(PDF) from the original on 2014-11-29. Retrieved2014-11-15.
- ^"N4279: Improved insertion interface for unique-key maps (Thomas Köppe)".Archived from the original on 2015-04-27. Retrieved2014-11-15.
- ^abc"New standard library papers adopted for C++17".Archived from the original on 2014-11-29. Retrieved2014-11-15.
- ^"N4280: Non-member size() and more (Riccardo Marcangelo)"(PDF).Archived(PDF) from the original on 2015-03-09. Retrieved2014-11-15.
- ^"N4284: Contiguous Iterators (Jens Maurer)".Archived from the original on 2014-11-29. Retrieved2014-11-15.
- ^"Filesystem Library Proposal (Beman Dawes)".Archived from the original on 2016-07-20. Retrieved2015-12-12.
- ^"The Parallelism TS Should be Standardized".Archived from the original on 2016-04-05. Retrieved2016-03-23.
- ^"Mathematical Special Functions for C++17, v5"(PDF).Archived(PDF) from the original on 2016-04-05. Retrieved2016-03-23.
- ^"N4659: Working Draft, Standard for Programming Language C++"(PDF). §23.7.Archived(PDF) from the original on 2017-12-07. Retrieved2017-03-24.
- ^"A byte type definition"(PDF).Archived(PDF) from the original on 2017-03-25. Retrieved2017-03-25.
- ^"N4659: Working Draft, Standard for Programming Language C++"(PDF). §23.15.8.Archived(PDF) from the original on 2017-12-07. Retrieved2017-03-24.
- ^"PMR (Polymorphic Memory Resources) fully described -- Nico Josuttis".Archived from the original on 2021-08-28. Retrieved2020-11-16.
- ^"N3981: Removing trigraphs??! (Richard Smith)". 2014-05-06.Archived from the original on 2018-07-09. Retrieved2015-04-03.
- ^IBM comment on preparing for a Trigraph-adverse future in C++17Archived 2018-09-11 at theWayback 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)".Archived from the original on 2017-10-20. Retrieved2014-11-28.
- ^"C++ Keywords: register".Archived from the original on 2018-09-03. Retrieved2018-09-03.
- ^"C++ Standards Support in GCC - GNU Project - Free Software Foundation (FSF)".gcc.gnu.org.Archived from the original on 2018-04-04. Retrieved2018-04-03.
- ^"Clang - C++17, C++14, C++11 and C++98 Status".clang.llvm.org.Archived from the original on 2013-07-04. Retrieved2018-06-26.
- ^corob-msft."Visual C++ Language Conformance".docs.microsoft.com.Archived from the original on 2018-06-19. Retrieved2018-06-19.
- ^"Announcing: MSVC Conforms to the C++ Standard". 7 May 2018.Archived from the original on 2018-08-26. Retrieved2018-05-08.
- ^"Chapter 1. Status".gcc.gnu.org.Archived from the original on 2018-06-04. Retrieved2018-06-19.
- ^"libc++ C++17 Status".llvm.org.Archived from the original on 2019-05-24. Retrieved2019-05-24.
- ^"Announcing: MSVC Conforms to the C++ Standard".devblogs.microsoft.com. 7 May 2018.Archived from the original on 2018-08-26. Retrieved2019-05-24.