C ++ 17 jest teraz kompletny, więc jest mało prawdopodobne, aby wystąpiły duże zmiany. Przedstawiono setki propozycji dla C ++ 17.
Które z tych funkcji zostały dodane do C ++ w C ++ 17?
W przypadku korzystania z kompilatora C ++ obsługującego „C ++ 1z”, które z tych funkcji będą dostępne po aktualizacji kompilatora do C ++ 17?
Odpowiedzi:
Funkcje językowe:
Szablony i kod ogólny
Odliczenie argumentu szablonu dla szablonów klas
template <auto>
Poprawki argumentów nietypowych szablonów
template<template<class...>typename bob> struct foo {}
(Składanie + ... + wyrażenia) i Wersje
auto x{8};
jestint
modernizacja za
using
pomocą...
i listlambda
constexpr lambdas
Schwytanie
*this
w lambdas[*this]{ std::cout << could << " be " << useful << '\n'; }
Atrybuty
[[fallthrough]]
,[[nodiscard]]
,[[maybe_unused]]
Atrybuty[[attributes]]
nanamespace
s ienum { erator[[s]] }
using
w atrybutach, aby uniknąć konieczności powtarzania przestrzeni nazw atrybutów.Od kompilatorów wymaga się teraz ignorowania niestandardowych atrybutów, których nie rozpoznają .
Czyszczenie składni
Zmienne wbudowane
namespace A::B
Prosty
static_assert(expression);
bez ciągunie,
throw
chyba żethrow()
ithrow()
jestnoexcept(true)
.Czystsza kontrola powrotu i przepływu
Wiązania strukturalne
std::tie
zauto
const auto [it, inserted] = map.insert( {"foo", bar} );
it
iinserted
z przewidywaną typu zpair
tym, żemap::insert
zyski.std::array
i względnie płaskimi strukturamiif (init; condition)
iswitch (init; condition)
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
if(decl)
na przypadki, w którychdecl
nie można rozsądnie zamienić na bool.Uogólnianie oparte na zakresie dla pętli
jeśli constexpr
Misc
Szesnastkowe literały zmiennoprzecinkowe
Dynamiczny przydział pamięci dla nadmiernie wyrównanych danych
Gwarantowana kopia kopii
Naprawiono kolejność oceny dla (niektórych) wyrażeń z pewnymi modyfikacjami
.then
działa w przyszłości.Bezpośrednia inicjalizacja list wyliczeń
Gwarancje postępu (FPG) (również FPG dla algorytmów równoległych )
u8'U', u8'T', u8'F', u8'8'
literały znakowe (łańcuch już istniał)„noexcept” w systemie typów
__has_include
Tablice poprawek konwersji wskaźnika
odziedziczone konstruktory poprawki w niektórych przypadkach narożnych ( przykłady zmian zachowania znajdują się w P0136R0 )
agregacja inicjalizacji z dziedziczeniem .
std::launder
, pisanie na klawiaturze itpDodatki do biblioteki:
Typy danych
std::variant<Ts...>
std::optional
std::any
std::string_view
std::string
jak odniesienie do tablicy znaków lub podłańcuchstring const&
. Może także sprawić, że parsowanie będzie bajillion razy szybsze."hello world"sv
char_traits
std::byte
więcej niż mogliby żuć.Wywoływanie rzeczy
std::invoke
std::apply
std::make_from_tuple
,std::apply
zastosowane do konstrukcji obiektuis_invocable
,is_invocable_r
,invoke_result
result_of
is_invocable<Foo(Args...), R>
jest „można wywołaćFoo
zArgs...
i dostać coś zgodnego zR
”, gdzieR=void
jest domyślna.invoke_result<Foo, Args...>
jeststd::result_of_t<Foo(Args...)>
jednak pozornie mniej zagmatwany?System plików TS v1
[class.path]
[class.filesystem.error]
[class.file_status]
[class.directory_entry]
[class.directory_iterator]
i[class.recursive_directory_iterator]
[fs.ops.funcs]
fstream
s można otworzyć za pomocąpath
s, a także za pomocąconst path::value_type*
ciągów.Nowe algorytmy
for_each_n
reduce
transform_reduce
exclusive_scan
inclusive_scan
transform_exclusive_scan
transform_inclusive_scan
Dodano dla celów wątków, ujawnione, nawet jeśli nie używasz ich wątków
Gwintowanie
std::shared_mutex
atomic<T>
::is_always_lockfree
scoped_lock<Mutexes...>
std::lock
bólu podczas blokowania więcej niż jednego muteksu na raz.Równoległość TS v1
std
algorytmów i powiązanych maszynsprzęt _ * _ rozmiar_zakłóceń
(części) Podstawy biblioteczne TS v1 nieuwzględnione powyżej lub poniżej
[func.searchers]
i[alg.search]
[pmr]
std::function
dla alokatorówstd::sample
, próbkowanie z zakresu?Ulepszenia kontenera
try_emplace
iinsert_or_assign
Łączenie na
map<>
,unordered_map<>
,set<>
, iunordered_set<>
non-const
.data()
dla łańcucha.nieczłonkowski
std::size
,std::empty
,std::data
std::begin
/end
Minimalne niepełne wsparcie typu w kontenerach
Ciągła „koncepcja” iteratora
constexpr
iteratoryemplace
Rodzina funkcji teraz zwraca odwołanie do utworzonego obiektu .Inteligentne zmiany wskaźnika
unique_ptr<T[]>
poprawki i inneunique_ptr
poprawki.weak_from_this
i niektóre ustalone do udostępnienia z tegoInne
std
ulepszenia typu danych:{}
budowastd::tuple
i inne ulepszeniaMisc
Biblioteka C ++ 17 oparta jest na C11 zamiast C99
Zarezerwowane
std[0-9]+
dla przyszłych bibliotek standardowychdestroy(_at|_n)
,uninitialized_move(_n)
,uninitialized_value_construct(_n)
,uninitialized_default_construct(_n)
std
ujawnionych implementacjistd::clamp()
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )
w przybliżeniugcd
ilcm
std::uncaught_exceptions
std::as_const
std::bool_constant
_v
zmiennych szablonustd::void_t<T>
std::owner_less<void>
std::less<void>
, ale dla inteligentnych wskaźników do sortowania według zawartościstd::chrono
Polskiestd::conjunction
,std::disjunction
,std::negation
Narażonychstd::not_fn
std
std :: default_order , pośrednictwo ponad(usuwa ABI niektórych kompilatorów z powodu zmiany nazwy, usunięte).std::less
.Cechy
Przestarzałe
<codecvt>
memory_order_consume
result_of
, zastąpiony przezinvoke_result
shared_ptr::unique
, nie jest bardzo wątkowo bezpiecznyIsocpp.org ma niezależną listę zmian od C ++ 14; został częściowo splądrowany.
Naturalnie praca TS trwa równolegle, więc niektóre TS nie są jeszcze wystarczająco dojrzałe i będą musiały poczekać na następną iterację. Celem następnej iteracji jest C ++ 20 zgodnie z wcześniejszym planem, a nie C ++ 19, jak sugerują niektóre pogłoski. C ++ 1O zostało uniknięte.
Początkowa lista zaczerpnięta z tego posta reddit i tego posta reddit , z linkami dodanymi przez googling lub z powyższej strony isocpp.org.
Dodatkowe wpisy splądrowane z listy testów funkcji SD-6 .
Lista funkcji dzyń za i biblioteka lista funkcji są obok zostać splądrowane. Nie wydaje się to wiarygodne, ponieważ jest to C ++ 1z, a nie C ++ 17.
w tych slajdach brakuje niektórych funkcji.
Chociaż nie zadawano pytania „co zostało usunięte”, oto krótka lista kilku rzeczy ((głównie?) Nieaktualnych), które zostały usunięte w C ++ 17 z C ++:
Oddalony:
register
, słowo kluczowe zastrzeżone do wykorzystania w przyszłościbool b; ++b;
<functional>
rzeczy,random_shuffle
std::function
Były przeformułowania. Nie jestem pewien, czy mają one jakikolwiek wpływ na kod, czy są to po prostu porządki w standardzie:
Dokumenty jeszcze nie zintegrowane z powyższymi:
P0505R0 (constexpr chrono)
P0418R2 (poprawki atomowe)
P0512R0 (poprawki w odejmowaniu argumentów szablonu)
P0490R0 ( poprawki strukturalne w wiązaniu)
P0513R0 (zmiany na
std::hash
)P0502R0 (wyjątki równoległe)
P0509R1 (aktualizacja ograniczeń dotyczących obsługi wyjątków)
P0012R1 (uczyń specyfikacje wyjątków częścią systemu typów)
P0510R0 (ograniczenia dotyczące wariantów)
P0504R0 (tagi dla opcji / wariantu / dowolnego)
P0497R0 (wspólne poprawki ptr)
P0508R0 (uchwyty węzłów powiązań strukturalnych)
P0521R0 (liczba używanych wskaźników wspólnych i unikalne zmiany?)
Zmiany specyfikacji:
Dalsze informacje:
dokumenty pogrupowane według roku; nie wszystkie są akceptowane
https://isocpp.org/files/papers/p0636r0.html
źródło
memory_order_consume
nie wydaje się być oficjalnie przestarzała. Jest to po prostu odradzane w notatce. Może warto o tym wspomnieć (na przykład z nawiasami końcowymi)?