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., namespaceX::Y{…} instead of namespaceX{namespaceY{…}}[8][9]
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)
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]
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]
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]