C++17

C++17 to wersja standardu ISO / IEC 14882 dla języka programowania C++ . C++17 zastąpił wcześniejszą wersję standardu C++, zwaną C++14 , a później został zastąpiony przez C++20 .

Historia

Zanim C++ Standards Committee ustalił 3-letni cykl wydawniczy, data wydania C++17 była niepewna. W tym okresie wersja C++17 była również nazywana C++1z , po C++0x lub C++1x dla C++11 i C++1y dla C++14 . Specyfikacja C++ 17 osiągnęła etap Draft International Standard (DIS) w marcu 2017 r. Ten DIS został jednogłośnie zatwierdzony, z jedynie komentarzami redakcyjnymi, a ostateczna wersja standardu została opublikowana w grudniu 2017 r. W Bibliotece szablonów standardu C++ wprowadzono kilka zmian , chociaż niektóre algorytmy w nagłówku <algorithm> składniowych otrzymały wsparcie dla jawnej równoległości i dokonano pewnych ulepszeń .

Nowe funkcje

C++17 wprowadził wiele nowych funkcji. Poniższe listy mogą być niekompletne.

Język

  • Uczynić wiadomość tekstową dla static_assert opcjonalną
  • Zezwalaj na nazwę typu (jako alternatywę dla class ) w parametrze szablonu szablonu
  • Nowe zasady automatycznego odejmowania z braced-init-list
  • Zagnieżdżone definicje przestrzeni nazw, np. przestrzeń nazw X :: Y { } zamiast przestrzeni nazw X { przestrzeń nazw Y { } }
  • Zezwalanie na atrybuty dla przestrzeni nazw i modułów wyliczających
  • Nowe standardowe atrybuty [[ fallthrough ]] , [[ Maybe_unused ]] i [[ nodiscard ]]
  • UTF-8 ( u8 ) (literały łańcuchowe UTF-8 istnieją od C++ 11 ; C++ 17 dodaje odpowiednie literały znakowe dla zachowania spójności, chociaż są one ograniczone do jednego bajtu i mogą przechowywać tylko „ Basic Latin " i kody kontrolne C0 , czyli ASCII )
  • Szesnastkowe literały zmiennoprzecinkowe
  • Użycie auto jako typu dla parametru szablonu innego niż typ
  • Stała ocena dla wszystkich argumentów szablonów innych niż typ
  • Wyrażenia składania dla szablonów zmiennokształtnych
  • Statyczny czas kompilacji if z formą if constexpr ( wyrażenie )
  • Strukturalne deklaracje wiązania, umożliwiające auto [ a , b ] = getTwoReturnValues ​​();
  • Inicjatory w instrukcjach if i switch
  • inicjalizacja kopiowania i bezpośrednia inicjalizacja obiektów typu T z wyrażeń prvalue typu T (ignorowanie kwalifikatorów cv najwyższego poziomu) nie powinna powodować kopiowania ani przenoszenia konstruktorów z wyrażenia prvalue. Zobacz kopiowanie elizji , aby uzyskać więcej informacji.
  • Niektóre rozszerzenia dotyczące nadmiernie wyrównanej alokacji pamięci
  • Dedukcja argumentów szablonu klasy (CTAD), wprowadzenie przewodników dedukcji konstruktora, np. zezwolenie std :: pair ( 5.0 , false ) zamiast wymagać jawnych typów argumentów konstruktora std :: pair < ​​double , bool > ( 5.0 , false ) lub dodatkowy szablon pomocniczy funkcja std :: make_pair ( 5.0 , fałsz ) .
  • Zmienne inline, które umożliwiają definiowanie zmiennych w plikach nagłówkowych bez naruszania zasady jednej definicji . Reguły są w rzeczywistości takie same jak w przypadku funkcji wbudowanych
  • __has_include , umożliwiając sprawdzenie dostępności nagłówka za pomocą dyrektyw preprocesora
  • Wartość __cplusplus zmieniono na 201703L
  • Specyfikacje wyjątków stały się częścią typu funkcji
  • Wyrażenia lambda mogą przechwytywać „*to” według wartości

Biblioteka

Usunięte funkcje

Ta wersja C++ nie tylko dodała nowe funkcje, ale także usunęła kilka.

  • Trygrafy zostały usunięte.
  • Niektóre przestarzałe typy i funkcje zostały usunięte z biblioteki standardowej , w tym std::auto_ptr , std::random_shuffle i stare adaptery funkcji. Zostały one zastąpione w C++ 11 przez ulepszone funkcje, takie jak std::unique_ptr , std::shuffle , std::bind i wyrażenia lambda.
  • (wcześniej przestarzałe) użycie rejestru słów kluczowych jako specyfikatora klasy pamięci. To słowo kluczowe jest nadal zarezerwowane , ale teraz nieużywane.

Wsparcie kompilatora

  • GCC ma pełną obsługę funkcji języka C++ 17 od wersji 8.
  • Clang 5 i nowsze obsługują wszystkie funkcje języka C++ 17.
  • Program Visual Studio 2017 15,8 (MSVC 19,15) i nowsze obsługuje wszystkie funkcje języka C++ 17.

Wsparcie biblioteki

  • libstdc++ od wersji 9.1 ma pełną obsługę C++17 (8.1 bez Parallelism TS i odwołuje się do C99 zamiast C11)
  • libc++ od wersji 9 ma częściowe wsparcie dla C++17, a pozostała część „w toku”
  • Visual Studio 2017 15,8 (MSVC 19,15) Standard Library i nowsze wersje obsługują wszystkie funkcje biblioteki C++ 17 z wyjątkiem „Elementary String Conversions” i odnoszą się do C99 zamiast C11. W programie Visual Studio 2019 16.4 dodano opcję „Podstawowe konwersje ciągów”.

Zobacz też