I'd use the C++17 flag by default, it's the default in the latest version of clang too iirc. You should use the latest language features as long as you don't need to support builds on older compilers or embedded platforms that only have outdated compilers, as mentioned above.
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.
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 auto
const 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_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?[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/end
Minimal 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 exposedstd::clamp()
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) ) roughlygcd and lcmstd::uncaught_exceptions
std::as_conststd::bool_constant_v template variablesstd::void_t<T>
std::owner_less<void>
std::less<void>, but for smart pointers to sort based on contentsstd::chrono polishstd::conjunction, std::disjunction, std::negation exposedstd::not_fn
stdstd::less.<codecvt>memory_order_consumeresult_of, replaced with invoke_result
shared_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