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 *<code>for</code>-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ä:


```cpp
// 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