C 17
   HOME

TheInfoList



OR:

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 C++11 is a version of the ISO/ IEC 14882 standard for the C++ programming language. C++11 replaced the prior version of the C++ standard, called C++03, and was later replaced by C++14. The name follows the tradition of naming language versio ...
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 in December 2017. Few changes were made to the C++
Standard Template Library The Standard Template Library (STL) is a software library originally designed by Alexander Stepanov for the C++ programming language that influenced many parts of the C++ Standard Library. It provides four components called ''algorithms'', ''co ...
, although some
algorithm In mathematics and computer science, an algorithm () is a finite sequence of rigorous instructions, typically used to solve a class of specific problems or to perform a computation. Algorithms are used as specifications for performing ...
s in the header were given support for explicit
parallelization Parallel computing is a type of computation in which many calculations or processes are carried out simultaneously. Large problems can often be divided into smaller ones, which can then be solved at the same time. There are several different f ...
and some
syntactic In linguistics, syntax () is the study of how words and morphemes combine to form larger units such as phrases and sentences. Central concerns of syntax include word order, grammatical relations, hierarchical sentence structure ( constituenc ...
enhancements were made.


New features

C++17 introduced many new features. The following lists may be incomplete.


Language

* Making the text message for optional * Allow (as an alternative to ) in a template template parameter * New rules for deduction from braced-init-list * Nested namespace definitions, e.g., instead of * Allowing attributes for
namespace In computing, a namespace is a set of signs (''names'') that are used to identify and refer to objects of various kinds. A namespace ensures that all of a given set of objects have unique names so that they can be easily identified. Namespaces ...
s and enumerators * New standard attributes , and *
UTF-8 UTF-8 is a variable-length character encoding used for electronic communication. Defined by the Unicode Standard, the name is derived from ''Unicode'' (or ''Universal Coded Character Set'') ''Transformation Format 8-bit''. UTF-8 is capable of ...
() character literals (UTF-8 string literals have existed since
C++11 C++11 is a version of the ISO/ IEC 14882 standard for the C++ programming language. C++11 replaced the prior version of the C++ standard, called C++03, and was later replaced by C++14. The name follows the tradition of naming language versio ...
; 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 ASCII ( ), abbreviated from American Standard Code for Information Interchange, is a character encoding standard for electronic communication. ASCII codes represent text in computers, telecommunications equipment, and other devices. Because ...
) * Hexadecimal
floating-point In computing, floating-point arithmetic (FP) is arithmetic that represents real numbers approximately, using an integer with a fixed precision, called the significand, scaled by an integer exponent of a fixed base. For example, 12.345 can be ...
literals * Use of as the type for a non-type template parameter * Constant evaluation for all non-type template arguments * Fold expressions, for variadic templates * A compile-time static with the form * Structured binding declarations, allowing * Initializers in and statements *
copy-initialization In computer programming, initialization (or initialisation) is the assignment of an initial value for a data object or variable. The manner in which initialization is performed depends on the programming language, as well as the type, storage cla ...
and direct-initialization of objects of type from prvalue expressions of type (ignoring top-level cv-qualifiers) shall result in no copy or move constructors from the prvalue expression. See
copy elision In C++ computer programming, copy elision refers to a compiler optimization technique that eliminates unnecessary copying of objects. The C++ language standard generally allows implementations to perform any optimization, provided the resulting pr ...
for more information. * Some extensions on over-aligned memory allocation * Class template argument deduction (CTAD), introducing constructor deduction guides, e.g. allowing instead of requiring explicit constructor arguments types or an additional helper template function . * 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 function In the C and C++ programming languages, an inline function is one qualified with the keyword inline; this serves two purposes: # It serves as a compiler directive that suggests (but does not require) that the compiler substitute the body o ...
s * , allowing the availability of a header to be checked by preprocessor directives * Value of changed to * Exception specifications were made part of the function type * Lambda expressions can capture "*this" by value


Library

* Most of Library Fundamentals TS I, including: **std::string_view, a read-only non-owning reference to a character sequence or string-slice ** 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_exception in
exception handling In computing and computer programming, exception handling is the process of responding to the occurrence of ''exceptions'' – anomalous or exceptional conditions requiring special processing – during the execution of a program. In general, a ...
* New insertion functions try_emplace and insert_or_assign for std::map and std::unordered_map key-value associative data structures * Uniform container access: std::size, std::empty and std::data * Definition of "contiguous iterators" * A
file system In computing, file system or filesystem (often abbreviated to fs) is a method and data structure that the operating system uses to control how data is stored and retrieved. Without a file system, data placed in a storage medium would be one lar ...
library based on boost::filesystem * Parallel versions of
STL STL may refer to: Communications * Standard telegraph level *Studio/transmitter link International law *Special Tribunal for Lebanon The Special Tribunal for Lebanon (STL), also referred to as the Lebanon Tribunal or the Hariri Tribunal, is a ...
algorithms * Additional mathematical
special functions Special functions are particular mathematical functions that have more or less established names and notations due to their importance in mathematical analysis, functional analysis, geometry, physics, or other applications. The term is defined ...
, including
elliptic integral In integral calculus, an elliptic integral is one of a number of related functions defined as the value of certain integrals, which were first studied by Giulio Fagnano and Leonhard Euler (). Their name originates from their originally arising in ...
s and
Bessel function Bessel functions, first defined by the mathematician Daniel Bernoulli and then generalized by Friedrich Bessel, are canonical solutions of Bessel's differential equation x^2 \frac + x \frac + \left(x^2 - \alpha^2 \right)y = 0 for an arbitrary ...
s * std::variant, a
tagged union In computer science, a tagged union, also called a variant, variant record, choice type, discriminated union, disjoint union, sum type or coproduct, is a data structure used to hold a value that could take on several different, but fixed, types. O ...
container * std::byte, allowing char to be replaced for data types intending to model a
byte The byte is a unit of digital information that most commonly consists of eight bits. Historically, the byte was the number of bits used to encode a single character of text in a computer and for this reason it is the smallest addressable unit ...
of data as a byte rather than a character * Logical operator traits: std::conjunction, std::disjunction and std::negation * header, for polymorphic memory resources


Removed features

This revision of C++ not only added new features but also removed a few. * Trigraphs were removed. * Some deprecated types and functions were removed from the standard library, including 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. * The (formerly deprecated) use of the keyword as a storage class specifier was removed. This keyword is still reserved but now unused.


Compiler support

* GCC has had complete support for C++17 language features since version 8. *
Clang Clang is a compiler front end for the C, C++, Objective-C, and Objective-C++ programming languages, as well as the OpenMP, OpenCL, RenderScript, CUDA, and HIP frameworks. It acts as a drop-in replacement for the GNU Compiler Collection ...
5 and later supports all C++17 language features. * Visual Studio 2017 15.8 (MSVC 19.15) and later supports all C++17 language features.


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) * libc++ as of version 9 has partial support for C++17, with the remainder "in progress" * 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


See also

* C++ compilers *
C11 (C standard revision) C11 (formerly C1X) is an informal name for ISO/IEC 9899:2011, a past standard for the C programming language. It replaced C99 (standard ISO/IEC 9899:1999) and has been superseded by C17 (standard ISO/IEC 9899:2018). C11 mainly standardizes f ...
* C17 (C standard revision)


References

{{ISO standards C++ C++ programming language family Programming language standards Articles with example C++ code IEC standards ISO standards