C++17
C++17 (C++1z) on ISOn hyväksymä C++-ohjelmointikielen standardiversio ISO/IEC 14882:2017, joka on julkaistu joulukuussa vuonna 2017.[1][2]
Standardi korvasi edellisen version ISO/IEC 14882:2014 (C++14). Standardin seuraaja on C++20.
Ominaisuudet
[muokkaa | muokkaa wikitekstiä]Kieleen ja standardikirjastoon liittyviä muutoksia ja ominaisuuksia:
- automaattinen template-mallin tyypin päättely[3]
- mallin käyttämä tyyppi voidaan päätellä annetuista parametreista
template<auto T> esimerkki { const auto value = T; }; esimerkki<1234> arvo;
- mallin käyttämä tyyppi voidaan päätellä annetuista parametreista
- poikkeustyyppirajoitteet (sallittujen tyyppien määrittely)[4]
- osittainen palautus aiemmin vanhentuneeksi merkitystä ominaisuudesta:
void f() throw(int);
- osittainen palautus aiemmin vanhentuneeksi merkitystä ominaisuudesta:
- inline-muuttujat[5]
- otsikkotiedostossa (engl. header) määritelty muuttuja, joka käyttäytyy kuten paikallisesti määritelty (voi poistaa tarpeen
extern
-muuttujien määrittelylle ja parempi käyttöturvallisuus)
- otsikkotiedostossa (engl. header) määritelty muuttuja, joka käyttäytyy kuten paikallisesti määritelty (voi poistaa tarpeen
- UTF-8-merkkijonoliteraalit[6]
myfunction(u8"Text")
- structured bindings[7]
auto [a, b] = getTwoValues();
if
-lause alustustoiminnolla[8]- mahdollistaa yhdenmukaistamista, samankaltainen alustaminen on jo ennestään
for
-lauseissa mahdollista, tuki myösswitch
-lauseisiin - esimerkiksi
if (QVariant v = getVar(); v.isValid()) cout << v.toInt() << endl;
- mahdollistaa yhdenmukaistamista, samankaltainen alustaminen on jo ennestään
- käännösaikainen
constexpr if
[9]if constexpr (true)
- yleistäminen aluerajatulle
for
-lauseelle[10] - sisäkkäiset nimiavaruudet[11]
- mahdollistaa
namespace A::B::C {}
käytön aiemmannamespace A { namespace B { namespace C {}}}
sijaan
- mahdollistaa
- fold-ilmaisut[12][13]
- muuttujasarjan käsittely:
template <typename T1, typename... T>
- muuttujasarjan käsittely:
- taattu kopion välttäminen (engl. copy elision)[14][15]
- kopiokonstruktori ja siirto-operaattori voidaan poistaa käytöstä
class Foo { Foo(const Foo &) = delete; Foo(const Foo &&) = delete; };
- kopiokonstruktori ja siirto-operaattori voidaan poistaa käytöstä
- tyyppiturvallinen union
std::variant
[16][17]variant<int, float> v;
std::any
[18]- toisin kuin
variant
sallii kaikki tyypit ajonaikaisesti käytettäväksi (ei käännösaikaista tarkistusta tai rajoitetta) ja vastaavasti tyyppiturvallisuus heikompi
- toisin kuin
std::optional
[18]std::string_view
, read-only-käsittelijä merkkijonolle[18]
Fold-ilmaisut
[muokkaa | muokkaa wikitekstiä]Fold-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ä.[19]
Esimerkkitapaus käytöstä:[20][13]
// 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
[muokkaa | muokkaa wikitekstiä]Standardoitu tiedostojärjestelmätuki (ISO/IEC TS 18822:2015) on yksi kehityskohde C++17:ssä.[21] Tiedostojärjestelmätuki sisältää muun muassa seuraavien asioiden käsittelyä:[22]
- hakemistoluettelot
- hakemistopolkujen käsittely
- absoluuttinen polku
- suhteellinen polku
- symboliset ja kovat linkit
Boost-kirjaston toteutusta ehdotettiin perustaksi standardoitavalle tuelle.[23][24][22]
Rinnakkaisuuden tuki STL-kirjastoissa
[muokkaa | muokkaa wikitekstiä]STL-kirjastojen rinnakkaisuustuen kehittäminen.[25] ISO/IEC TS 19570:2015 on liitetty C++17:n standardiin.[26]
Kiistanalaiset muutokset
[muokkaa | muokkaa wikitekstiä]Trigraphien (kolmen merkin tokenit) poistamisen ehdotus[27] on herättänyt vastustusta mm. IBM:ltä liittyen EBCDIC-merkistön käyttöön.[28]
Kääntäjätuki
[muokkaa | muokkaa wikitekstiä]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.[29]
- GCC-kääntäjän tuki on suurelta osin valmis kääntäjän versiossa 7.[30]
Lähteet
[muokkaa | muokkaa wikitekstiä]- ↑ Current Status isocpp.org. Viitattu 6.2.2017.
- ↑ ISO/IEC 14882:2017 ISO. Viitattu 5.12.2017.
- ↑ Class template deduction en.cppreference.com. Viitattu 6.2.2017.
- ↑ dynamic exception specification en.cppreference.com. Viitattu 6.2.2017.
- ↑ Finkel, Hal & Smith, Richard: Inline Variables open-std.org. Viitattu 7.3.2017.
- ↑ char8_t: A type for UTF-8 characters and strings open-std.org. Viitattu 6.2.2017.
- ↑ C++17 Structured Bindings skebanga.github.io. Arkistoitu 18.10.2016. Viitattu 20.2.2017.
- ↑ If statement with initializer open-std.org. Viitattu 3.3.2017.
- ↑ P0292R1: constexpr if: A slightly different syntax open-std.org. Viitattu 3.3.2017.
- ↑ Generalizing the Range-Based For Loop open-std.org. Viitattu 10.4.2017.
- ↑ Nested namespace definition (revision 2) open-std.org. Viitattu 3.3.2017.
- ↑ fold expression en.cppreference.com. Viitattu 7.3.2017.
- ↑ a b Wicht, Baptiste: C++17 Fold Expressions baptiste-wicht.com. Viitattu 7.3.2017.
- ↑ Guaranteed Copy Elision jonasdevlieghere.com. Viitattu 7.3.2017.
- ↑ Copy elision en.cppreference.com. Viitattu 7.3.2017.
- ↑ Variant: a type-safe union that is rarely invalid open-std.org. Viitattu 6.2.2017.
- ↑ std::variant en.cppreference.com. Viitattu 6.2.2017.
- ↑ a b c Dawes, Beman & Meredith, Alisdair: Adopt Library Fundamentals V1 TS Components for C++17 (R1) isocpp.org. Viitattu 8.3.2017.
- ↑ Functional in C++17 and C++20 modernescpp.com. Viitattu 8.5.2017.
- ↑ Hamelin, Adrien: C++17 Fold Expressions—Baptiste Wicht isocpp.org. Viitattu 8.3.2017.
- ↑ Adopt the File System TS for C++17 open-std.org. Viitattu 6.2.2017.
- ↑ a b Filesystem library en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
- ↑ Filesystem Library Proposal (Revision 4) open-std.org. Viitattu 10.4.2017.
- ↑ Filesystem Library Version 3 boost.org. Viitattu 10.4.2017.
- ↑ The Parallelism TS Should be Standardized isocpp.org. Viitattu 10.4.2017.
- ↑ Experimental C++ Features en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
- ↑ Removing trigraphs??! open-std.org. Viitattu 6.2.2017.
- ↑ IBM comment on preparing for a Trigraphadverse future in C++17 open-std.org. Viitattu 6.2.2017.
- ↑ C++ Support in Clang clang.llvm.org. Viitattu 7.3.2017.
- ↑ C++ Standards Support in GCC gcc.gnu.org. Viitattu 7.3.2017.
Aiheesta muualla
[muokkaa | muokkaa wikitekstiä]- C++17 Working Draft (englanniksi)
- Taulukko ominaisuuksien kääntäjätuen tilanteesta (englanniksi)