C++17 is a version of the
ISO
ISO is the most common abbreviation for the International Organization for Standardization.
ISO or Iso may also refer to: Business and finance
* Iso (supermarket), a chain of Danish supermarkets incorporated into the SuperBest chain in 2007
* Iso ...
/
IEC
The International Electrotechnical Commission (IEC; in French: ''Commission électrotechnique internationale'') is an international standards organization that prepares and publishes international standards for all electrical, electronic and r ...
14882 standard for the
C++
C++ (pronounced "C plus plus") is a high-level general-purpose programming language created by Danish computer scientist Bjarne Stroustrup as an extension of the C programming language, or "C with Classes". The language has expanded significan ...
programming language. C++17 replaced the prior version of the C++ standard, called
C++14
C++14 is a version of the ISO/IEC 14882 standard for the C++ programming language. It is intended to be a small extension over C++11, featuring mainly bug fixes and small improvements, and was replaced by C++17. Its approval was announced on Augus ...
, and was later replaced by
C++20 C20 or C-20 may refer to:
Science and technology
* Carbon-20 (C-20 or 20C), an isotope of carbon
* C20, the smallest possible fullerene (a carbon molecule)
* C20 (engineering), a mix of concrete that has a compressive strength of 20 newtons per sq ...
.
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 versions b ...
and C++1y for
C++14
C++14 is a version of the ISO/IEC 14882 standard for the C++ programming language. It is intended to be a small extension over C++11, featuring mainly bug fixes and small improvements, and was replaced by C++17. Its approval was announced on Augus ...
. 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 Library (computer science), 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 ...
, 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 Computational problem, problems or to perform a computation. Algorithms are used as specificat ...
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 fo ...
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 (constituency), ...
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-width encoding, 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'' ...
() 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 versions b ...
; 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
The C0 and C1 control code or control character sets define control codes for use in text by computer systems that use ASCII and derivatives of ASCII. The codes represent additional information about the text, such as the position of a cursor, ...
, 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 of ...
)
* 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 b ...
literals
* Use of as the type for a non-type template parameter
* Constant evaluation for all non-type template arguments
* Fold expressions, for
variadic template In computer programming, variadic templates are templates that take a variable number of arguments.
Variadic templates are supported by C++ (since the C++11 standard), and the D programming language.
C++
The variadic template feature of C++ was d ...
s
* A compile-time static with the form
* Structured binding declarations, allowing
* Initializers in and statements
*
copy-initialization 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 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 One Definition Rule (ODR) is an important rule of the C++ programming language that prescribes that classes/structs and non-inline functions cannot have more than one definition in the entire program and template and types cannot have more than ...
. 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 of ...
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, an ...
* New insertion functions
try_emplace
and
insert_or_assign
for
std::map
and
std::unordered_map
key-value associative data structures
* Uniform
container
A container is any receptacle or enclosure for holding a product used in storage, packaging, and transportation, including shipping.
Things kept inside of a container are protected on several sides by being inside of its structure. The term ...
access:
std::size
,
std::empty
and
std::data
* Definition of "contiguous
iterator
In computer programming, an iterator is an object that enables a programmer to traverse a container, particularly lists. Various types of iterators are often provided via a container's interface. Though the interface and semantics of a given iterat ...
s"
* 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 larg ...
library based on
boost::filesystem
*
Parallel
Parallel is a geometric term of location which may refer to:
Computing
* Parallel algorithm
* Parallel computing
* Parallel metaheuristic
* Parallel (software), a UNIX utility for running programs in parallel
* Parallel Sysplex, a cluster of ...
versions of
STL 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 b ...
, 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 arbitrar ...
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
Char may refer to:
People
*Char Fontane, American actress
*Char Margolis, American spiritualist
* René Char (1907–1988), French poet
*The Char family of Colombia:
** Fuad Char, Colombian senator
** Alejandro Char Chaljub, mayor of Barranquilla ...
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
Reserved is a Polish apparel retailer headquartered in Gdańsk, Pomerania, Poland. It was founded in 1999 and remains the largest company of the LPP group, which has more than 1,700 retail stores located in over 20 countries and also owns such ...
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
Visual Studio is an integrated development environment (IDE) from Microsoft. It is used to develop computer programs including web site, websites, web apps, web services and mobile apps. Visual Studio uses Microsoft software development platfor ...
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
Visual Studio is an integrated development environment (IDE) from Microsoft. It is used to develop computer programs including web site, websites, web apps, web services and mobile apps. Visual Studio uses Microsoft software development platfor ...
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
Visual Studio is an integrated development environment (IDE) from Microsoft. It is used to develop computer programs including websites, web apps, web services and mobile apps. Visual Studio uses Microsoft software development platforms such ...
16.4
See also
*
C++ compilers
C, or c, is the third letter in the Latin alphabet, used in the modern English alphabet, the alphabets of other western European languages and others worldwide. Its name in English is ''cee'' (pronounced ), plural ''cees''.
History
"C" ...
*
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 fea ...
*
C17 (C standard revision)
C17 is the informal name for ISO/IEC 9899:2018, the most recent standard for the C programming language, prepared in 2017 and published in June 2018. It replaced C11 (standard ISO/IEC 9899:2011). C17 will be superseded by C2x.
Since it was un ...
References
{{ISO standards
C++
C++ programming language family
Programming language standards
Articles with example C++ code
IEC standards
ISO standards