VOOZH about

URL: https://fi.wikipedia.org/wiki/C++17

⇱ C++17 – Wikipedia


Siirry sisältöön
Wikipediasta

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.

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;
  • poikkeustyyppirajoitteet (sallittujen tyyppien määrittely)[4]
    • osittainen palautus aiemmin vanhentuneeksi merkitystä ominaisuudesta: void f() throw(int);
  • 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)
  • 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ös switch-lauseisiin
    • esimerkiksi if (QVariant v = getVar(); v.isValid()) cout << v.toInt() << endl;
  • 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 aiemman namespace A { namespace B { namespace C {}}} sijaan
  • fold-ilmaisut[12][13]
    • muuttujasarjan käsittely: template <typename T1, typename... T>
  • 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; };
  • 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
  • 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
autoold_sum(){
return0;
}

template<typenameT1,typename...T>
autoold_sum(T1s,T...ts){
returns+old_sum(ts...);;
}

// Better with fold expressions
template<typename...T>
autofold_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]

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]
  1. Current Statusisocpp.org. Viitattu 6.2.2017.
  2. ISO/IEC 14882:2017ISO. Viitattu 5.12.2017.
  3. Class template deductionen.cppreference.com. Viitattu 6.2.2017.
  4. dynamic exception specificationen.cppreference.com. Viitattu 6.2.2017.
  5. Finkel, Hal & Smith, Richard:Inline Variablesopen-std.org. Viitattu 7.3.2017.
  6. char8_t: A type for UTF-8 characters and stringsopen-std.org. Viitattu 6.2.2017.
  7. C++17 Structured Bindingsskebanga.github.io.Arkistoitu18.10.2016. Viitattu 20.2.2017.
  8. If statement with initializeropen-std.org. Viitattu 3.3.2017.
  9. P0292R1: constexpr if: A slightly different syntaxopen-std.org. Viitattu 3.3.2017.
  10. Generalizing the Range-Based For Loopopen-std.org. Viitattu 10.4.2017.
  11. Nested namespace definition (revision 2)open-std.org. Viitattu 3.3.2017.
  12. fold expressionen.cppreference.com. Viitattu 7.3.2017.
  13. 1 2 Wicht, Baptiste:C++17 Fold Expressionsbaptiste-wicht.com. Viitattu 7.3.2017.
  14. Guaranteed Copy Elisionjonasdevlieghere.com. Viitattu 7.3.2017.
  15. Copy elisionen.cppreference.com. Viitattu 7.3.2017.
  16. Variant: a type-safe union that is rarely invalidopen-std.org. Viitattu 6.2.2017.
  17. std::varianten.cppreference.com. Viitattu 6.2.2017.
  18. 1 2 3 Dawes, Beman & Meredith, Alisdair:Adopt Library Fundamentals V1 TS Components for C++17 (R1)isocpp.org. Viitattu 8.3.2017.
  19. Functional in C++17 and C++20modernescpp.com. Viitattu 8.5.2017.
  20. Hamelin, Adrien:C++17 Fold Expressions—Baptiste Wichtisocpp.org. Viitattu 8.3.2017.
  21. Adopt the File System TS for C++17open-std.org. Viitattu 6.2.2017.
  22. 1 2 Filesystem libraryen.cppreference.com. Viitattu 25.2.2020.(englanniksi)
  23. Filesystem Library Proposal (Revision 4)open-std.org. Viitattu 10.4.2017.
  24. Filesystem Library Version 3boost.org. Viitattu 10.4.2017.
  25. The Parallelism TS Should be Standardizedisocpp.org. Viitattu 10.4.2017.
  26. Experimental C++ Featuresen.cppreference.com. Viitattu 25.2.2020.(englanniksi)
  27. Removing trigraphs??!open-std.org. Viitattu 6.2.2017.
  28. IBM comment on preparing for a Trigraphadverse future in C++17open-std.org. Viitattu 6.2.2017.
  29. C++ Support in Clangclang.llvm.org. Viitattu 7.3.2017.
  30. C++ Standards Support in GCCgcc.gnu.org. Viitattu 7.3.2017.

Aiheesta muualla

[muokkaa | muokkaa wikitekstiä]