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.
Kieleen ja standardikirjastoon liittyviä muutoksia ja ominaisuuksia:
template<auto T> esimerkki { const auto value = T; }; esimerkki<1234> arvo;void f() throw(int);extern-muuttujien määrittelylle ja parempi käyttöturvallisuus)myfunction(u8"Text")auto [a, b] = getTwoValues();if-lause alustustoiminnolla
for-lauseissa mahdollista, tuki myös switch-lauseisiinif (QVariant v = getVar(); v.isValid()) cout << v.toInt() << endl; constexpr if
if constexpr (true)for-lauseellenamespace A::B::C {} käytön aiemman namespace A { namespace B { namespace C {}}} sijaantemplate <typename T1, typename... T>class Foo { Foo(const Foo &) = delete; Foo(const Foo &&) = delete; };std::variant
variant<int, float> v;std::any
variant sallii kaikki tyypit ajonaikaisesti käytettäväksi (ei käännösaikaista tarkistusta tai rajoitetta) ja vastaavasti tyyppiturvallisuus heikompistd::optionalstd::string_view, read-only-käsittelijä merkkijonolleFold-ilmaisut (engl. fold expressions) laajentaa kieleen aiemmin lisättyjä toimintoja ja mahdollistaa yksinkertaisemman käsittelyn eräille toiminnoille.
Mallineille annettava muuttuva määrä parametreja (engl. variadic templates) 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.
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ä:
Boost-kirjaston toteutusta ehdotettiin perustaksi standardoitavalle tuelle.
STL-kirjastojen rinnakkaisuustuen kehittäminen. ISO/IEC TS 19570:2015 on liitetty C++17:n standardiin.
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 merkitään vielä C++1z standardin virallisen vahvistamisen ollessa kesken. Ohjelmointikielen kääntäjät ovat jo pitkällä standardin toteuttamisessa: