C++17
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.
| C++ language revisions | 
|---|
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.
Removed
    
This revision of C++ not only added new features but also removed a few.
- Removal of trigraphs.[5][6]
- Removal of some deprecated types and functions from the standard library, including std::auto_ptr,std::random_shuffle, and old function adaptors.[7][8] These were superseded in C++11 by improved facilities such asstd::unique_ptr,std::shuffle,std::bind, and lambdas.
- Removal of the (formerly deprecated) use of the keyword registeras a storage class specifier.[9] This keyword is now reserved and unused.
New features
    
C++17 introduced many new features. The following lists may be incomplete.
Language
    
- Making the text message for static_assertoptional[10]
- Allow typename(as an alternative toclass) in a template template parameter[11]
- New rules for autodeduction from braced-init-list[12][7]
- Nested namespace definitions, e.g., namespace X::Y { … }instead ofnamespace X { namespace Y { … } }[7][13]
- Allowing attributes for namespaces and enumerators[14][15]
- New standard attributes [[fallthrough]],[[maybe_unused]]and[[nodiscard]][16]
- UTF-8 (u8) character literals[14][17] (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[18][19]
- Use of autoas the type for a non-type template parameter[20]
- Constant evaluation for all non-type template arguments[14][21]
- Fold expressions, for variadic templates[14][22]
- A compile-time static ifwith the formif constexpr(expression)[23]
- Structured binding declarations, allowing auto [a, b] = getTwoReturnValues();[24]
- Initializers in ifandswitchstatements[25]
- copy-initialization and direct-initialization of objects of type Tfrom prvalue expressions of typeT(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[26]
- Class template argument deduction (CTAD), introducing constructor deduction guides, eg. 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).[27][28]
- 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[29]
- Value of __cpluspluschanged to201703L[30]
- Exception specifications were made part of the function type[31]
- Lambda expressions can capture "*this" by value[32]
Library
    
- Most of Library Fundamentals TS I, including:[33][34]
- std::string_view, a read-only non-owning reference to a character sequence or string-slice[35]
- std::optional, for representing optional objects, a data type that may not always be returned by a given algorithm with support for non-return
- std::any, for holding single values of any type
 
- std::uncaught_exceptions, as a replacement of- std::uncaught_exceptionin exception handling[36][14]
- New insertion functions try_emplaceandinsert_or_assignforstd::mapandstd::unordered_mapkey-value associative data structures[37][38]
- Uniform container access: std::size,std::emptyandstd::data[38][39]
- Definition of "contiguous iterators"[38][40]
- A file system library based on boost::filesystem[41]
- Parallel versions of STL algorithms[42]
- Additional mathematical special functions, including elliptic integrals and Bessel functions[43]
- std::variant, a tagged union container[44]
- std::byte, allowing char to be replaced for data types intending to model a byte of data as a byte rather than a character[45]
- Logical operator traits: std::conjunction,std::disjunctionandstd::negation[46]
- <memory_resource>header, for polymorphic memory resources[47]
Compiler support
    
    
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]
References
    
- "N4661 Editors' Report -- Programming Languages -- C++". 21 March 2017. Retrieved 2017-03-21.
- "ISO/IEC DIS 14882: Programming Languages — C++" (PDF). Archived from the original (PDF) on 2017-03-25.
- Herb Sutter. "C++17 is formally approved".
- "ISO/IEC 14882:2017".
- "N3981: Removing trigraphs??! (Richard Smith)". 2014-05-06.
- IBM comment on preparing for a Trigraph-adverse future in C++17, IBM paper N4210, 2014-10-10. Authors: Michael Wong, Hubert Tong, Rajan Bhakta, Derek Inglis
- "Updates to my trip report".
- "N4190: Removing auto_ptr, random_shuffle(), And Old <functional> Stuff (Stephan T. Lavavej)".
- "C++ Keywords: register".
- "N3928: Extending static_assert, v2 (Walter E. Brown)" (PDF).
- "N4051: Allow typename in a template template parameter (Richard Smith)".
- "N3922: New Rules for auto deduction from braced-init-list (James Dennett)".
- "N4230: Nested namespace definition (Robert Kawulak, Andrew Tomazos)".
- "New core language papers adopted for C++17".
- "N4266: Attributes for namespaces and enumerators (Richard Smith)".
- "N4640: Working Draft, Standard for Programming Language C++" (PDF). pp. 193–195.
- "N4267: Adding u8 character literals (Richard Smith)".
- Thomas Köppe. "Hexadecimal floating literals for C++".
- "N4659: Working Draft, Standard for Programming Language C++" (PDF). §5.13.4.
- James Touton; Mike Spertus (2016-06-23). "Declaring non-type template parameters with auto".
- "N4268: Allow constant evaluation for all non-type template arguments (Richard Smith)".
- "N4295: Folding expressions (Andrew Sutton, Richard Smith)".
- "N4659: Working Draft, Standard for Programming Language C++" (PDF). §9.4.1.
- "N4659: Working Draft, Standard for Programming Language C++" (PDF). §11.5.
- "Selection statements with initializer".
- "Dynamic memory allocation for over-aligned data".
- "Class template argument deduction".
- "CppCon 2018: Timur Doumler "Class template argument deduction in C++17"".
- "N4640: Working Draft, Standard for Programming Language C++" (PDF). pp. 431–433.
- "N4659: Working Draft, Standard for Programming Language C++" (PDF). §19.8.
- "P0012R1: Make exception specifications be part of the type system, version 5".
- "P0018R3: Lambda Capture of *this by Value as [=,*this], version 3".
- "Adopt Library Fundamentals V1 TS Components for C++17 (R1)".
- "Current Status".
- "std::basic_string_view - cppreference.com". en.cppreference.com. Retrieved 2016-06-23.
- "N4259: Wording for std::uncaught_exceptions (Herb Sutter)" (PDF).
- "N4279: Improved insertion interface for unique-key maps (Thomas Köppe)".
- "New standard library papers adopted for C++17".
- "N4280: Non-member size() and more (Riccardo Marcangelo)" (PDF).
- "N4284: Contiguous Iterators (Jens Maurer)".
- "Filesystem Library Proposal (Beman Dawes)".
- "The Parallelism TS Should be Standardized".
- "Mathematical Special Functions for C++17, v5" (PDF).
- "N4659: Working Draft, Standard for Programming Language C++" (PDF). §23.7.
- "A byte type definition" (PDF).
- "N4659: Working Draft, Standard for Programming Language C++" (PDF). §23.15.8.
- "PMR (Polymorphic Memory Resources) fully described -- Nico Josuttis".
- "C++ Standards Support in GCC - GNU Project - Free Software Foundation (FSF)". gcc.gnu.org.
- "Clang - C++17, C++14, C++11 and C++98 Status". clang.llvm.org.
- corob-msft. "Visual C++ Language Conformance". docs.microsoft.com.
- "Announcing: MSVC Conforms to the C++ Standard".
- "Chapter 1. Status". gcc.gnu.org.
- "libc++ C++17 Status". llvm.org.
- "Announcing: MSVC Conforms to the C++ Standard". devblogs.microsoft.com.
