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?
Template argument deduction for class templates
template <auto>
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
constexpr lambdas
Capturing *this in lambdas
[*this]{ std::cout << could << " be " << useful << '\n'; }[[fallthrough]], [[nodiscard]], [[maybe_unused]] attributes
[[attributes]] on namespaces 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.
Inline variables
namespace A::B
Simple static_assert(expression); with no string
no throw unless throw(), and throw() is noexcept(true).
Structured bindings
std::tie with autoconst auto [it, inserted] = map.insert( {"foo", bar} );it and inserted with deduced type from the pair that map::insert returns.std::arrays and relatively flat structsif (init; condition) and switch (init; condition)
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)if(decl) to cases where decl isn't convertible-to-bool sensibly.Generalizing range-based for loops
if constexpr
Hexadecimal float point literals
Dynamic memory allocation for over-aligned data
Guaranteed copy elision
Fixed order-of-evaluation for (some) expressions with some modifications
.then on future work.Direct list-initialization of enums
Forward progress guarantees (FPG) (also, FPGs for parallel algorithms)
u8'U', u8'T', u8'F', u8'8' character literals (string already existed)
"noexcept" in the type system
__has_include
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
std::variant<Ts...>
std::optional
std::any
std::string_view
std::string like reference-to-character-array or substringstring const& again. Also can make parsing a bajillion times faster."hello world"svchar_traitsstd::byte off more than they could chew.
std::invoke
std::apply
std::make_from_tuple, std::apply applied to object construction
is_invocable, is_invocable_r, invoke_result
result_ofis_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?[class.path]
[class.filesystem.error]
[class.file_status]
[class.directory_entry]
[class.directory_iterator] and [class.recursive_directory_iterator]
[fs.ops.funcs]
fstreams can be opened with paths, as well as with const path::value_type* strings.
for_each_n
reduce
transform_reduce
exclusive_scan
inclusive_scan
transform_exclusive_scan
transform_inclusive_scan
Added for threading purposes, exposed even if you aren't using them threaded
std::shared_mutex
atomic<T>::is_always_lockfree
scoped_lock<Mutexes...>
std::lock pain when locking more than one mutex at a time.Parallelism TS v1
std algorithms, and related machineryhardware_*_interference_size
[func.searchers] and [alg.search]
[pmr]
std::function for allocatorsstd::sample, sampling from a range?
try_emplace and insert_or_assign
Splicing for map<>, unordered_map<>, set<>, and unordered_set<>
non-const .data() for string.
non-member std::size, std::empty, std::data
std::begin/endMinimal incomplete type support in containers
Contiguous iterator "concept"
constexpr iterators
The emplace family of functions now returns a reference to the created object.
unique_ptr<T[]> fixes and other unique_ptr tweaks.weak_from_this and some fixed to shared from thisstd datatype improvements:{} construction of std::tuple and other improvementsC++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)
std implementations exposedSpecial math functions
std::clamp()
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) ) roughlygcd and lcm
std::uncaught_exceptions
std::as_const
std::bool_constant
A whole bunch of _v template variables
std::void_t<T>
std::owner_less<void>
std::less<void>, but for smart pointers to sort based on contentsstd::chrono polish
std::conjunction, std::disjunction, std::negation exposed
std::not_fn
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 (breaks ABI of some compilers due to name mangling, removed.)std::less.
memory_order_consume, added language to prefer use of memory_order_acquire
<codecvt>result_of, replaced with invoke_resultshared_ptr::unique, it isn't very threadsafeIsocpp.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++:
register, keyword reserved for future usebool b; ++b;<functional> stuff, random_shufflestd::functionThere were rewordings. I am unsure if these have any impact on code, or if they are just cleanups in the standard:
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?)
papers grouped by year; not all accepted
https://isocpp.org/files/papers/p0636r0.html
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With