TeamQuest Blog

Standard C++20 został sfinalizowany. Zwięzłe omówienie popularniejszych nowości

Standard C++20 został sfinalizowany. Zwięzłe omówienie popularniejszych nowości

Przemysław Pintal , 21.02.2020 r.

Komitet Standaryzujący język C++, w dniach 10-15 lutego 2020 roku, zebrał się w Pradze na konferencji WG21 (Working Group 21), którą sponsorowała firma Avast. Oznacza to, że standard C++20 został sfinalizowany od strony technicznej. Natomiast oficjalna publikacja powinna nastąpić w maju bieżącego roku. Warto nadmienić, iż całość prac nad kolejnymi rewizjami C++ nie odbywa się wyłącznie na międzynarodowych spotkaniach, istotne są też listy mailingowe i cykliczne telekonferencje. Wydaje się nieprawdopodobnym, by projekt międzynarodowej normy (DIS - Draft International Standard) został odrzucony, niemniej taka okoliczność jest hipotetycznie możliwa, toteż wydłużyłoby to prace nad standardem o kolejne miesiące. Oprócz tego zaadaptowano także plan dla C++23, m.in. modularną bibliotekę standardową. Ciekawostką okazał się fakt, że było to największe w dziejach spotkanie komitetu dedykowanego pracom na rzecz C++. Przybyły 252 osoby.

C++20 uchodzi za rewolucję tożsamą w skali C++11. Jednymi z najgłośniejszych nowości jest wprowadzenie korutynów i modułów. Pierwsze są funkcjami umożliwiającymi uśpienie bądź wybudzenie ich wykonania, przy zachowaniu aktualnego stanu. Naturalnym wydaje się wykorzystanie korutynów w aplikacjach których logika determinowana jest zdarzeniami, czyli w grach lub w symulacjach bądź w serwerach. Korutyny stosuje się typowo w wielozadaniowości bez wywłaszczania, tj. kiedy wątek otrzymuje tyle czasu ile mu potrzeba, bez oglądania się na systemowy scheduler. Drugie pozwala przezwyciężyć ograniczenia plików nagłówkowych, tzn. podział na pliki ze źródłami i nagłówkami staje się pozbawiony znaczenia! Ponadto przyspieszają one czas kompilacji. Co ważniejsze programista C++ staje się niezależny względem makr preprocesora, pozostaje nieistotnym kolejność ładowania modułów! Co ciekawe to identyczne nazwy modułów nie kolidują ze sobą. Poszczególne moduły mogą zostać połączone w większy pakiet, w celu dostarczenia ich do konsumentów.

Jako kolejne i prominentne novum wyróżnia się biblioteka Ranges (zakresy), która polega na konceptach (są to restrykcje przewidziane dla szablonów względem wykorzystywanych typów). Ranges stanowią abstrakcję dla programów C++ co operują na elementach struktury danych w sposób jednolity i definiują wymagania dla typu który zezwala na iterację jego własnych elementów poprzez zapewnienie iteratora i wartownika jakie określają początek i koniec zakresu. Nadto Ranges wprowadza Views, co umożliwia manipulację danymi lub filtrowanie owych zakresów, a także zwracanie zmodyfikowanych wersji pierwotnych zakresów jako kolejne i łączenie ich w łańcuchy. Owe powinno korzystnie wpłynąć na sprawdzanie poprawności typów i lepsze generowanie komunikatów błędów przez kompilator. Wprowadzenie Ranges do standardu spotkało się z gromkim aplauzem na sali.

Standard C++20

Pozostałe funkcje to m.in. trójdrożny operator porównania (three-way comparison operator, zwany także “spaceship operator”), który zwraca obiekt jednej z porównywanych kategorii, w porządku leksykograficznym, jakiej wartość odpowiada stanowi komparacji. std::format() czyli nowa biblioteka odpowiedzialna za formatowanie strumieni i obsługująca argumenty pozycyjne, formatowanie daty i godzIny, nadto jest rozszerzalna wobec typów zdefiniowanych przez użytkownika. Zaktualizowano constexpr, toteż można go użyć dla instrukcji union, trycatch, dynamic_cast, alokacji pamięci i typeid. Zmiana pozwala też użyć constexpr dla std::vector i std::string, prócz tego istnieją też algorytmy constexpr, takie jak std::sort, std::rotate, std::revers. jthread zachowuje się podobnie względem std::thread, jednakże automatycznie dołącza w czasie destrukcji, a zatrzymywanie tokenów dopuszcza większą kontrolę nad wykonywanym wątkiem.

Na horyzoncie z wolna majaczy dalsza rewizja, mianowicie C++23. Jednym z priorytetów będzie “dokończenie” samego C++20. W związku z tym należy stworzyć moduły dla biblioteki standardowej i zapewnić wsparcie tejże dla korutyn bowiem nie istnieją typy “świadome” ich istnienia. Nadto dodanie funkcji o nazwie executor (zawierają zasady kiedy, gdzie i jak uruchomić callable - funkcja, obiekt funkcji lub funkcja lambda) i bazującej na niej biblioteki sieciowej. Najprawdopodobniej Reflection, Pattern matchingContracts ukażą się dopiero w wydaniu C++26.

Najnowsze oferty pracy:

Polecane wpisy na blogu IT:

Szukasz pracownika IT?

Dostarczymy Ci najlepszych specjalistów z branży IT. Wyślij zapytanie

Wyrażam zgodę TeamQuest Sp. z o.o. na przetwarzanie moich danych osobowych w celu marketingu produktów i usług własnych TeamQuest, w tym na kontaktowanie się ze mną w formie połączenia telefonicznego lub środkami elektronicznymi.
Administratorem podanych przez Ciebie danych osobowych jest TeamQuest Sp. z o.o., z siedzibą w Warszawie (00-814), ul. Miedziana 3a/21, zwana dalej „Administratorem".
Jeśli masz jakiekolwiek pytania odnośnie przetwarzania przez nas Twoich danych, skontaktuj się z naszym Inspektorem Ochrony Danych (IOD). Do Twojej dyspozycji jest pod adresem e-mail: office@teamquest.pl.
W jakim celu i na jakiej podstawie będziemy wykorzystywać Twoje dane? Dowiedz się więcej