| C++ language revisions |
|---|
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.
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. This DIS was unanimously approved, with only editorial comments, and the final standard was published as ISO/IEC 14882:2017 in December 2017. 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.
C++17 introduced many new features. The following lists may be incomplete.
static_assert optionaltypename (as an alternative to class) in a template template parameterauto deduction from braced-init-listnamespace X::Y { ... } instead of namespace X { namespace Y { ... } }[[fallthrough]], [[maybe_unused]] and [[nodiscard]]u8) character literals (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)auto as the type for a non-type template parameterif with the form if constexpr (expression)auto [a, b] = getTwoReturnValues();if and switch statementsT 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.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).__has_include, allowing the availability of a header to be checked by preprocessor directives__cplusplus changed to 201703L*this" by value<string_view> header: std::string_view, a read-only non-owning reference to a character sequence or string-slice<optional>: std::optional, for representing optional objects, a data type that may not always be returned by a given algorithm with support for non-return<any>: std::any, for representing the any type, which holds a single value of any typestd::uncaught_exceptions, as a replacement of std::uncaught_exception in exception handling. Located in <exception>. uncaught_exceptions counts the number of exceptions in the current thread that have been thrown/rethrown and not yet entered a matching catch clause, whereas uncaught_exception only detects whether stack unwinding is in progress.try_emplace and insert_or_assign for std::map (a tree map) and std::unordered_map (a hash map) key-value associative data structuresstd::size, std::empty and std::data<filesystem>: a file system library, std::filesystem (based on boost::filesystem)<cmath>: additional mathematical special functions, including elliptic integrals and Bessel functions<variant>: std::variant, a tagged union containerstd::byte, allowing char to be replaced for data types intending to model a byte of data as a byte rather than a characterstd::conjunction, std::disjunction and std::negation<memory_resource> header, for polymorphic memory resourcesThis revision of C++ not only added new features but also removed a few.
std::auto_ptr, std::random_shuffle, and old function adaptors. These were superseded in C++11 by improved facilities such as std::unique_ptr, std::shuffle, std::bind, and lambdas.register as a storage class specifier was removed. This keyword is still reserved but now unused.