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:

Fold-ilmaisut

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

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ä:

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:

Lähteet

  1. ↑ Current Status isocpp.org. Viitattu 6.2.2017.
  2. ↑ ISO/IEC 14882:2017 ISO. Viitattu 5.12.2017.
  3. ↑ Class template deduction en.cppreference.com. Viitattu 6.2.2017.
  4. ↑ dynamic exception specification en.cppreference.com. Viitattu 6.2.2017.
  5. ↑ Finkel, Hal & Smith, Richard: Inline Variables open-std.org. Viitattu 7.3.2017.
  6. ↑ char8_t: A type for UTF-8 characters and strings open-std.org. Viitattu 6.2.2017.
  7. ↑ C++17 Structured Bindings skebanga.github.io. Arkistoitu 18.10.2016. Viitattu 20.2.2017.
  8. ↑ If statement with initializer open-std.org. Viitattu 3.3.2017.
  9. ↑ P0292R1: constexpr if: A slightly different syntax open-std.org. Viitattu 3.3.2017.
  10. ↑ Generalizing the Range-Based For Loop open-std.org. Viitattu 10.4.2017.
  11. ↑ Nested namespace definition (revision 2) open-std.org. Viitattu 3.3.2017.
  12. ↑ fold expression en.cppreference.com. Viitattu 7.3.2017.
  13. 1 2 Wicht, Baptiste: C++17 Fold Expressions baptiste-wicht.com. Viitattu 7.3.2017.
  14. ↑ Guaranteed Copy Elision jonasdevlieghere.com. Viitattu 7.3.2017.
  15. ↑ Copy elision en.cppreference.com. Viitattu 7.3.2017.
  16. ↑ Variant: a type-safe union that is rarely invalid open-std.org. Viitattu 6.2.2017.
  17. ↑ std::variant en.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++20 modernescpp.com. Viitattu 8.5.2017.
  20. ↑ Hamelin, Adrien: C++17 Fold Expressions—Baptiste Wicht isocpp.org. Viitattu 8.3.2017.
  21. ↑ Adopt the File System TS for C++17 open-std.org. Viitattu 6.2.2017.
  22. 1 2 Filesystem library en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
  23. ↑ Filesystem Library Proposal (Revision 4) open-std.org. Viitattu 10.4.2017.
  24. ↑ Filesystem Library Version 3 boost.org. Viitattu 10.4.2017.
  25. ↑ The Parallelism TS Should be Standardized isocpp.org. Viitattu 10.4.2017.
  26. ↑ Experimental C++ Features en.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++17 open-std.org. Viitattu 6.2.2017.
  29. ↑ C++ Support in Clang clang.llvm.org. Viitattu 7.3.2017.
  30. ↑ C++ Standards Support in GCC gcc.gnu.org. Viitattu 7.3.2017.

Aiheesta muualla