Jakie są nowe funkcje w C ++ 17?

1007

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?

Jak - Adam Nevraumont
źródło
26
Pełna lista funkcji zgodnych z Clang: biblioteka , język podstawowy .
Kerrek SB
3
ten blog ma ładne podsumowanie: bfilipek.com/2017/01/cpp17features.html
atb
13
Zobacz oficjalny dokument Zmiany między C ++ 14 i C ++ 17 DIS (P0636r0), aby uzyskać listę głównych zmian z C ++ 14 na C ++ 17.
jotik
1
@RaghavNavada Świetnie! Czy sekcja C ++ 20 jest utrzymywana? Jest # 53 , ale jest zamknięty ...
LF
Wszystko na tej stronie en.cppreference.com/w/cpp jest oznaczone wymaganą wersją.
jw_

Odpowiedzi:

1266

Funkcje językowe:

Szablony i kod ogólny

lambda

Atrybuty

Czyszczenie składni

Czystsza kontrola powrotu i przepływu

  • Wiązania strukturalne

    • Zasadniczo, pierwszej klasy std::tiezauto
    • Przykład:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Tworzy zmienne iti insertedz przewidywaną typu z pairtym, że map::insertzyski.
    • Działa z krotkami / polubieniami std::arrayi względnie płaskimi strukturami
    • Właściwie nazwane strukturyzowane Wiązania w standardzie
  • if (init; condition) i switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Rozciąga się if(decl)na przypadki, w których declnie można rozsądnie zamienić na bool.
  • Uogólnianie oparte na zakresie dla pętli

    • Wydaje się, że jest to głównie wsparcie dla wartowników lub końcowych iteratorów, które nie są tego samego typu co iteratory początkowe, co pomaga w pętlach zakończonych zerem i temu podobnych.
  • jeśli constexpr

    • Bardzo pożądana funkcja upraszczająca prawie ogólny kod.

Misc

Dodatki do biblioteki:

Typy danych

  • std::variant<Ts...>

    • Prawie zawsze niepuste ostatnio sprawdziłem?
    • Oznaczony typ unii
    • {niesamowite | przydatne}
  • std::optional

    • Może trzyma coś
    • Śmiesznie przydatne
  • std::any

    • Przechowuje jedną dowolną zawartość (którą można skopiować)
  • std::string_view

    • std::string jak odniesienie do tablicy znaków lub podłańcuch
    • Nigdy więcej nie bierz string const&. Może także sprawić, że parsowanie będzie bajillion razy szybsze.
    • "hello world"sv
    • constexpr char_traits
  • std::byte więcej niż mogliby żuć.

    • Ani liczba całkowita, ani znak, tylko dane

Wywoływanie rzeczy

System plików TS v1

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

(części) Podstawy biblioteczne TS v1 nieuwzględnione powyżej lub poniżej

Ulepszenia kontenera

Inteligentne zmiany wskaźnika

Inne stdulepszenia typu danych:

Misc

Cechy

Przestarzałe

Isocpp.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:

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:

Jak - Adam Nevraumont
źródło
2
Hm, memory_order_consumenie 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)?
LF