C++17
wersje językowe C++ |
---|
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ę dlaclass
) w parametrze szablonu szablonu - Nowe zasady
automatycznego
odejmowania z braced-init-list - Zagnieżdżone definicje przestrzeni nazw, np.
przestrzeń nazw X :: Y { … }
zamiastprzestrzeni 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
iswitch
-
inicjalizacja kopiowania i bezpośrednia inicjalizacja obiektów typu
T
z wyrażeń prvalue typuT
(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 konstruktorastd :: pair < double , bool > ( 5.0 , false )
lub dodatkowy szablon pomocniczy funkcjastd :: 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 na201703L
- Specyfikacje wyjątków stały się częścią typu funkcji
- Wyrażenia lambda mogą przechwytywać „*to” według wartości
Biblioteka
- Większość podręczników Library Fundamentals TS I, w tym:
-
std::string_view
, odniesienie tylko do odczytu, które nie jest właścicielem, do sekwencji znaków lub fragmentu łańcucha -
std::opcjonalne
, do reprezentowania opcjonalnych obiektów , typ danych, który nie zawsze może zostać zwrócony przez dany algorytm z obsługą non-return -
std::any
, do przechowywania pojedynczych wartości dowolnego typu
-
-
std::uncaught_exceptions
, jako zamiennikstd::uncaught_exception
w obsłudze wyjątków - Nowe funkcje wstawiania
try_emplace
iinsert_or_assign
dlastd::map
istd::unordered_map
asocjacyjnych struktur danych typu klucz-wartość - Jednolity dostęp do kontenera :
std::size
,std::empty
istd::data
- Definicja „ciągłych iteratorów ”
- Biblioteka systemu plików oparta na
boost::filesystem
- Równoległe wersje algorytmów STL
- Dodatkowe matematyczne funkcje specjalne , w tym całki eliptyczne i funkcje Bessela
-
std::variant
, oznaczony kontener związkowy -
std::byte
, umożliwiając zastąpienie char dla typów danych, które zamierzają modelować bajt danych jako bajt, a nie znak - Cechy operatorów logicznych:
std::conjunction
,std::disjunction
istd::negation
-
Nagłówek
<memory_resource> dla polimorficznych zasobów pamięci
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 jakstd::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”.