C++17 (C++1z) on ISOn hyväksymä C++-ohjelmointikielen standardiversio ISO/IEC 14882:2017, joka on julkaistu joulukuussa vuonna 2017.
Standardi korvasi edellisen version ISO/IEC 14882:2014 (C++14). Standardin seuraaja on C++20.
Ominaisuudet
Kieleen ja standardikirjastoon liittyviä muutoksia ja ominaisuuksia: automaattinen template-mallin tyypin päättely mallin käyttämä tyyppi voidaan päätellä annetuista parametreista template<auto T> esimerkki { const auto value = T; }; esimerkki<1234> arvo; poikkeustyyppirajoitteet (sallittujen tyyppien määrittely) osittainen palautus aiemmin vanhentuneeksi merkitystä ominaisuudesta: void f() throw(int); inline-muuttujat otsikkotiedostossa () määritelty muuttuja, joka käyttäytyy kuten paikallisesti määritelty (voi poistaa tarpeen extern-muuttujien määrittelylle ja parempi käyttöturvallisuus) UTF-8-merkkijonoliteraalit myfunction(u8"Text") structured bindings auto [a, b] = getTwoValues(); if-lause alustustoiminnolla mahdollistaa yhdenmukaistamista, samankaltainen alustaminen on jo ennestään for-lauseissa mahdollista, tuki myös switch-lauseisiin esimerkiksi if (QVariant v = getVar(); v.isValid()) cout << v.toInt() << endl; käännösaikainen constexpr if if constexpr (true) yleistäminen aluerajatulle for-lauseelle sisäkkäiset nimiavaruudet mahdollistaa namespace A::B::C {} käytön aiemman namespace A { namespace B { namespace C {}}} sijaan fold-ilmaisut muuttujasarjan käsittely: template <typename T1, typename... T> taattu kopion välttäminen () kopiokonstruktori ja siirto-operaattori voidaan poistaa käytöstä class Foo { Foo(const Foo &) = delete; Foo(const Foo &&) = delete; }; tyyppiturvallinen union std::variant variant<int, float> v; std::any toisin kuin variant sallii kaikki tyypit ajonaikaisesti käytettäväksi (ei käännösaikaista tarkistusta tai rajoitetta) ja vastaavasti tyyppiturvallisuus heikompi std::optional std::string_view, read-only-käsittelijä merkkijonolle
Fold-ilmaisut
Fold-ilmaisut () laajentaa kieleen aiemmin lisättyjä toimintoja ja mahdollistaa yksinkertaisemman käsittelyn eräille toiminnoille.
Mallineille annettava muuttuva määrä parametreja () mahdollistaa Haskell-kielen fold-ilmaisujen toteuttamisen C++-kielellä.
Esimerkkitapaus käytöstä:
// Good with variadics auto old_sum(){ return 0;
template<typename T1, typename... T> auto old_sum(T1 s, T... ts){ return s + old_sum(ts...);;
// Better with fold expressions template<typename... T> auto fold_sum_1(T... s){ return (... + s); }
Uudessa menetelmässä inline-määrittely yksinkertaistuu ja ulkopuolista aputoimintoa ei tarvita, muuttujalistan purkaminen yksittäisiin ei myöskään ole tarpeen tehdä vaan sen voi jättää kääntäjän/kielen hallittavaksi.
Tiedostojärjestelmätuki
Standardoitu tiedostojärjestelmätuki (ISO/IEC TS 18822:2015) on yksi kehityskohde C++17:ssä. Tiedostojärjestelmätuki sisältää muun muassa seuraavien asioiden käsittelyä: hakemistoluettelot hakemistopolkujen käsittely absoluuttinen polku suhteellinen polku symboliset ja kovat linkit
Boost-kirjaston toteutusta ehdotettiin perustaksi standardoitavalle tuelle.
Rinnakkaisuuden tuki STL-kirjastoissa STL-kirjastojen rinnakkaisuustuen kehittäminen. ISO/IEC TS 19570:2015 on liitetty C++17:n standardiin.
Kiistanalaiset muutokset
Trigraphien (kolmen merkin tokenit) poistamisen ehdotus on herättänyt vastustusta mm. IBM:ltä liittyen EBCDIC-merkistön käyttöön.
Kääntäjätuki
Kääntäjätuki merkitään vielä C++1z standardin virallisen vahvistamisen ollessa kesken. Ohjelmointikielen kääntäjät ovat jo pitkällä standardin toteuttamisessa: LLVM/Clang-kääntäjän tuki on suurelta osin valmis kääntäjän versiossa 4. GCC-kääntäjän tuki on suurelta osin valmis kääntäjän versiossa 7.
Lähteet
Aiheesta muualla C++17 Working Draft Taulukko ominaisuuksien kääntäjätuen tilanteesta
Luokka:C++