C++17 is now feature complete, so unlikely to experience large changes. Hundreds of proposals were put forward for C++17.
Which of those features were added to C++ in C++17?
When using a C++ compiler that supports \"C++1z\", which of those features are going to be available when the compiler updates to C++17?
Language features:
Templates and Generic Code
Template argument deduction for class templates
- Like how functions deduce template arguments, now constructors can deduce the template arguments of the class
- http://wg21.link/p0433r2 http://wg21.link/p0620r0 http://wg21.link/p0512r0
template <auto>
- Represents a value of any (non-type template argument) type.
Non-type template arguments fixes
template<template<class...>typename bob> struct foo {}
( Folding + ... + expressions ) and Revisions
auto x{8};
is an int
modernizing using
with ...
and lists
Lambda
Attributes
[[fallthrough]]
, [[nodiscard]]
, [[maybe_unused]]
attributes
[[attributes]]
on namespace
s and enum { erator[[s]] }
using
in attributes to avoid having to repeat an attribute namespace.
Compilers are now required to ignore non-standard attributes they don\'t recognize.
- The C++14 wording allowed compilers to reject unknown scoped attributes.
Syntax cleanup
Inline variables
- Like inline functions
- Compiler picks where the instance is instantiated
- Deprecate static constexpr redeclaration, now implicitly inline.
namespace A::B
Simple static_assert(expression);
with no string
no throw
unless throw()
, and throw()
is noexcept(true)
.
Cleaner multi-return and flow control
Misc
Hexadecimal float point literals
Dynamic memory allocation for over-aligned data
Guaranteed copy elision
- Finally!
- Not in all cases, but distinguishes syntax where you are \"just creating something\" that was called elision, from \"genuine elision\".
Fixed order-of-evaluation for (some) expressions with some modifications
- Not including function arguments, but function argument evaluation interleaving now banned
- Makes a bunch of broken code work mostly, and makes
.then
on future work.
Direct list-initialization of enums
Forward progress guarantees (FPG) (also, FPGs for parallel algorithms)
- I think this is saying \"the implementation may not stall threads forever\"?
u8\'U\', u8\'T\', u8\'F\', u8\'8\'
character literals (string already existed)
\"noexcept\" in the type system
__has_include
- Test if a header file include would be an error
- makes migrating from experimental to std almost seamless
Arrays of pointer conversion fixes
inherited constructors fixes to some corner cases (see P0136R0 for examples of behavior changes)
aggregate initialization with inheritance.
std::launder
, type punning, etc
Library additions:
Data types
Invoke stuff
std::invoke
- Call any callable (function pointer, function, member pointer) with one syntax. From the standard INVOKE concept.
std::apply
- Takes a function-like and a tuple, and unpacks the tuple into the call.
std::make_from_tuple
, std::apply
applied to object construction
is_invocable
, is_invocable_r
, invoke_result
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0077r2.html
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0604r0.html
- Deprecates
result_of
is_invocable<Foo(Args...), R>
is \"can you call Foo
with Args...
and get something compatible with R
\", where R=void
is default.
invoke_result<Foo, Args...>
is std::result_of_t<Foo(Args...)>
but apparently less confusing?
File System TS v1
[class.path]
[class.filesystem.error]
[class.file_status]
[class.directory_entry]
[class.directory_iterator]
and [class.recursive_directory_iterator]
[fs.ops.funcs]
fstream
s can be opened with path
s, as well as with const path::value_type*
strings.
New algorithms
Threading
(parts of) Library Fundamentals TS v1 not covered above or below
Container Improvements
try_emplace
and insert_or_assign
- gives better guarantees in some cases where spurious move/copy would be bad
Splicing for map<>
, unordered_map<>
, set<>
, and unordered_set<>
- Move nodes between containers cheaply.
- Merge whole containers cheaply.
non-const .data()
for string.
non-member std::size
, std::empty
, std::data
Minimal incomplete type support in containers
Contiguous iterator \"concept\"
constexpr
iterators
The emplace
family of functions now returns a reference to the created object.
Smart pointer changes
unique_ptr<T[]>
fixes and other unique_ptr
tweaks.
weak_from_this
and some fixed to shared from this
Other std
datatype improvements:
{}
construction of std::tuple
and other improvements
- TriviallyCopyable reference_wrapper, can be performance boost
Misc
C++17 library is based on C11 instead of C99
Reserved std[0-9]+
for future standard libraries
destroy(_at|_n)
, uninitialized_move(_n)
, uninitialized_value_construct(_n)
, uninitialized_default_construct(_n)
- utility code already in most
std
implementations exposed
- Special math functions
std::clamp()
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )
roughly
gcd
and lcm
std::uncaught_exceptions
- Required if you want to only throw if safe from destructors
std::as_const
std::bool_constant
- A whole bunch of
_v
template variables
std::void_t<T>
- Surprisingly useful when writing templates
std::owner_less<void>
- like
std::less<void>
, but for smart pointers to sort based on contents
std::chrono
polish
std::conjunction
, std::disjunction
, std::negation
exposed
std::not_fn
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0358r1.html
- Rules for noexcept within
std
- std::is_contiguous_layout, useful for efficient hashing
- std::to_chars/std::from_chars, high performance, locale agnostic number conversion; finally a way to serialize/deserialize to human readable formats (JSON & co)
std::default_order, indirection over std::less
. (breaks ABI of some compilers due to name mangling, removed.)
Traits
- swap
- is_aggregate
- has_unique_object_representations
Deprecated
- Some C libraries,
<codecvt>
memory_order_consume
result_of
, replaced with invoke_result
shared_ptr::unique
, it isn\'t very threadsafe
Isocpp.org has has an independent list of changes since C++14; it has been partly pillaged.
Naturally TS work continues in parallel, so there are some TS that are not-quite-ripe that will have to wait for the next iteration. The target for the next iteration is C++20 as previously planned, not C++19 as some rumors implied. C++1O has been avoided.
Initial list taken from this reddit post and this reddit post, with links added via googling or from the above isocpp.org page.
Additional entries pillaged from SD-6 feature-test list.
clang\'s feature list and library feature list are next to be pillaged. This doesn\'t seem to be reliable, as it is C++1z, not C++17.
these slides had some features missing elsewhere.
While \"what was removed\" was not asked, here is a short list of a few things ((mostly?) previous deprecated) that are removed in C++17 from C++:
Removed:
register
, keyword reserved for future use
bool b; ++b;
- trigraphs
- if you still need them, they are now part of your source file encoding, not part of language
- ios aliases
- auto_ptr, old
<functional>
stuff, random_shuffle
- allocators in
std::function
There were rewordings. I am unsure if these have any impact on code, or if they are just cleanups in the standard:
Papers not yet integrated into above:
P0505R0 (constexpr chrono)
P0418R2 (atomic tweaks)
P0512R0 (template argument deduction tweaks)
P0490R0 (structured binding tweaks)
P0513R0 (changes to std::hash
)
P0502R0 (parallel exceptions)
P0509R1 (updating restrictions on exception handling)
P0012R1 (make exception specifications be part of the type system)
P0510R0 (restrictions on variants)
P0504R0 (tags for optional/variant/any)
P0497R0 (shared ptr tweaks)
P0508R0 (structured bindings node handles)
P0521R0 (shared pointer use count and unique changes?)
Spec changes:
- exception specs and throw expressions
Further reference: