C++17

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 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 ` * 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 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 auto old_sum(T1 s, T... ts){ return s + old_sum(ts...);; } // Better with fold expressions template 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++