C++17 formalnie (prawie) gotowe…

W marcu tego roku, na spotkaniu komitetu standaryzacyjnego C++ w Kona, technicznie zakończono prace nad nową odsłoną standardu języka C++. Nowy draft DIS (N4660) przesłano do finalnego balotowania przez ISO (ISO ballot) i za 5-6 miesięcy oficjalnie powitamy C++17. Zapewne, prócz drobnych ewentualnych korekt w dokumencie, technicznie nic się nie zmieni, więc nieformalnie takie drafty traktowane są już przez społeczność jako standard. Obecnie ostatnim dostępnym dokumentem jest N4659 (różniący się jedynie formatowaniem od niedostępnego publicznie N4660).

Nowe C++17 jest głównym wydaniem (major release) standardu języka. Podobnie jak C++98 i C++11 wprowadza większe lub mniejsze rewolucje oraz funkcjonalności do samego języka oraz bibliotek standardowych, w przeciwieństwie do drobnych aktualizacji standardu, jak to miało miejsce przy C++03 i C++14. Idealnie tok obecnych zmian przedstawia strona z bieżącym statusem prac na isocpp.org.

Po tym wydarzeniu (tj. po zimowym spotkaniu w Kona), ale nie tylko, bo już na długo przed zakończeniem prac komitetu, w sieci pojawiło się wiele ciekawych materiałów dotyczących nowości i zmian wprowadzanych w nadchodzącym standardzie. Ale dopiero teraz zaczęły pojawiać się podsumowania wraz z porównaniami do poprzedniej rewizji (C++14). Sam co jakiś czas zerkałem jednym okiem na to co się zmienia. Nawet myślałem, że znacznie bliżej przyjrzę się tym zmianom, ale po mojej jedynej notatce związanej z C++17 (Elementy usunięte w C++17), szczególnie mi się do tego nie spieszyło. A po spotkaniu w Kona, liczyłem, że jakieś większe swoje przemyślenia w tym temacie opublikuję dopiero po finalnej publikacji ISO.

W międzyczasie dokumentacja ta w sieci się nieźle rozrosła i często trafiłam na różne dobre opracowania. Starałem się te najciekawsze sobie gdzieś zanotować, by w wolnej chwili się z nimi bliżej zapoznać. Ostatecznie uznałem, że może jest to dobry czas na napisanie tych kilku zdań i zebraniu ciekawych linków w jednym miejscu. W miarę możliwości poniższa lista może ulec zmianie, gdy trafie na coś dobrego.

  • Changes between C++14 and C++17 DIS (Thomas Köppe)
    Oficjalny dokument WG21 o numerze P0636R0. Ten dokument wymienia wszystkie najważniejsze zmiany, które wprowadzono od czasu publikacji C++14, aż do wydania C++17 DIS (N4660). Zawiera także różne fragmenty demonstrujące możliwości C++17 w porównaniu do starszej jego wersji. Jest do dobry punkt wyjścia w zaznajomieniu się z wchodzącym nowym standardem.

  • C++ 17 Features (Bartłomiej Filipek)
    Kompletna lista nowości C++17 z krótkimi opisami pochodząca z blogu Bartka Filipka (@fenbf). Kontent dostępny także na githuie autora cpp17features. Godne polecenia, tak jak blog i twitter autora, gdzie często można trafić na fajne materiały związane głównie z C++.

  • C++17 in TT's (Tony Van Eerd)
    Opis nowej funkcjonalności C++17 prezentowany w formacie "Tony Tables", czyli ładnej oprawie z przykładami i fragmentami kodów zapisanych w C++17 i C++14 w ramach porównania nowych możliwości i idiomów.

  • Modern C++ Features (Anthony Calandra)
    Może nie stricte C++17, ale godne polecenia zestawienie funkcjonalności języka i biblioteki standardowej niezbędne w nowoczesnym programowaniu w C++ (modern C++). Przez co zawiera najbardziej rozpoznawalne możliwości wprowadzone w C++11/14/17...

  • Trip report: Winter ISO C++ standards meeting (Kona), C++17 is complete (Herb Sutter)
    Sprawozdanie ze spotkania komitetu standaryzującego na blogu Herba Suttera. Chyba najbardziej rozpoznawalne miejsce, to miedzy innymi stąd jako pierwszy dowiedziałem się o zakończeniu prac nad C++17.

  • Trip Report: C++ Standards Meeting in Kona, February 2017 (Botond Ballon)
    Kolejne sprawozdanie z meetingu w Kona na blogu Botond Ballona, z nieco obszerniejszą treścią w kontekście wprowadzanych zmian i zapadłych decyzji komitetu.

Wielki szacunek dla autorów za poświęcony czas, wyszukanie i zebranie tak pokaźnych i dobrych materiałów, szczególnie tych prezentujących listę zmian z dodatkowymi przykładami. To z kolei wyręcza mnie od żmudnej analizy treści poszczególnych dokumentów i draftów komitetu standaryzującego, choć przejrzenie finalnego dokumentu standardu jest zawsze wskazane.

Ale, żeby nie być gołosłownym, mogę podrzucić kilka zmian i nowości, które w tej chwili dla mnie wydają się małym błogosławieństwem, ułatwiającym codzienne życie z C++-em.

Na pewno "fold expressions", "constexpr if" i poprawiona "auto dedukcja" typów ułatwią wszelkie zabawy z meta-programowaniem i tworzeniem generycznych algorytmów. Podobne odczucia mam odnośnie "inline variables" i "template variables" (to akurat z C++14).

Wprowadzono kilka nowych typów i elementów w STL-u: std::byte, std::any, std::optional i std::variant. Ciekawi mnie czemu dla std::byte nie dodano jasnej specyfikacji w postaci byte_t, tak jak robią to inne podobne typy dostępne w C czy C++. Na wzmiankę zasluguje też fakt dodania std::string_view, który znacznie ułatwi, a w wielu miejsch pwozoli uniknąć kopiowania poszczególnych fragmentów stringów...

Doczekaliśmy się pełnej obsługi systemu plików w bibliotece standardowej - std::filesystem. Jak można się domyślać, większość takich nowych elementów pochodzi bezpośrednio z boost-a. Podobnie będzie z obsługą sieci i podobnymi bebechami z TR/TS (Technical Reports/Technical Specifications).

Wprowadzone smaczki językowe w postaci "nested namespaces" i "structured binding declarations", w moim odczuciu też znacznie poprawią wydajność i czytelność tworzonego kodu.

To tak na szybko, tylko to co mi właśnie w tej chwili przychodzi do głowy. Wiele nowych elementów jeszcze nie miałem okazji zobaczyć, a co dopiero użyć w jakimś kodzie, choćby testowym i eksperymentalnym. Ale znaczna ich cześć zdecydowanie poprawia wydajność i wygodę korzystania z samego języka C++. Nie wykluczone, że w osobnych notatkach podzielę się dokładniejszymi spostrzeżeniami i komentarzami odnośnie poszczególnych elementów języka (niekoniecznie tylko tych z C++17, ale też C++14)...

[Aktualizacja 20/05/2017 @ 15:00]

Zaktualizowałem nieco wpis z drobnym przeredagowaniem. Dodałem tez nowe odnośniki do ciekawych opracowań związanych z nowym standardem języka C++. Naprawdę warto się z nimi zapoznać ;)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *