In this article we are going to address the topic of C++17, a topic that has generated interest and debate in contemporary society. C++17 has been the object of study, reflection and controversy, and its impact has been felt in various areas, from the personal to the global level. Throughout this article, we will explore the different aspects related to C++17, from its origin and evolution to its relevance in today's world. We will also analyze the various opinions and positions that exist around C++17, as well as the implications it has on people's lives and society in general. Through an interdisciplinary approach, this article seeks to provide a comprehensive and in-depth vision of C++17, with the aim of contributing to the understanding and reflection on this topic that is so relevant today.
2017 edition of the C++ programming language standard
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]
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]