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<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.

Katso myös 
 Englanninkielisen Wikipedian artikkeli aiheesta

Lähteet

Aiheesta muualla 
 C++17 Working Draft 
 Taulukko ominaisuuksien kääntäjätuen tilanteesta 

C++