C++20
C++20 on C++-ohjelmointikielen ISO-standardiversio ISO/IEC 14882:2020, jonka kehitys alkoi C++17-standardin valmistumisen jälkeen.[1] Standardiversio äänestettiin valmiiksi 15. helmikuuta 2020 ja hyväksytyksi ISO:n äänestyksessä syyskuussa.[2][3] Standardiversio on julkaistu joulukuussa 2020.[4] Edellinen standardiversio on ISO/IEC 14882:2017 C++17. Seuraava kehitettävä versio tulee olemaan C++23.[5]
Kehityskohdat
[muokkaa | muokkaa wikitekstiä]Version kehityskohtia ovat muun muassa:[1][6]
- moduulit[7]
- rinnakkaisuuden jatkokehitys[8][9][10]
- uusi synkronointikirjasto[11]
- latch ja barrier luokat[12][13]
- concepts[14][15]
- ranges[16]
- coroutines[17]
- lambda-operaattoreiden käytön rajoitteiden vähentäminen
decltype
-yhteydessä[18][=, this]
-kaappaus[19]
- kolmisuuntainen vertailu nk. avaruusalusoperaattorilla
<=>
[20] volatile
-tuen merkintä suurelta osin vanhentuneeksi[21]std::span
[22]- ominaisuustestimakroja esikääntäjälle[23]
- bittioperaatioita[24][25]
char8_t
lisäys,char16_t
jachar32_t
muutokset (u"foo"
jaU"foo"
) Unicode-tukeen- vanhentuneeksi merkittyjen ominaisuuksien poistoja
Haskell-kielen tyyppinen konsepti-ominaisuus, ranges-kirjasto sekä std::future
odotetaan olevan myös kehityskohteina.[26]
Bjarne Stroustrup julkaisi työryhmälle paperin nimellä Remember the Vasa! viitaten Vasa-laivaan, jossa hän muistutti perusasioiden tärkeydestä ominaisuuksien määrän sijaan.[27]
Stroustrup on sanonut C++20-standardista sen olevan ”kolmas merkittävä standardi” (kuudesta standardista), jossa merkittävä tarkoittaa sen ”muuttavan ihmisten ajattelutapaa”.[2] Merkittäviksi kohdiksi mainitaan:[2]
- concepts
- moduulit
- coroutines
Moduulien käyttö voi mahdollistaa esikääntäjästä luopumisen.[2]
Lykättyjä tai hylättyjä ominaisuuksia
[muokkaa | muokkaa wikitekstiä]- contracts on lykätty versioon C++23/C++26.[28][29]
- verkko-ohjelmointituen laajennukset (ISO/IEC TS 19216:2018)[30][31]
- reflektio[31][32]
- transaktiomuistin tuki[33][34]
Standardia on kuitenkin myös kritisoitu päätöksistä säilyttää yhteensopivuus ja haluttomuudesta rikkoa ABI-yhteensopivuus.[35][36] ABI:n muutoksilla pyrittäisiin saavuttamaan parempaa suorituskykyä.[35]
std::format
[muokkaa | muokkaa wikitekstiä]Standardikirjaston lisäys std::format
on uusi vaihtoehto merkkijonojen muotoiluun, jonka tavoitteena on tarjota sama joustavuus kuin printf
-sarjan funktioilla.[28]
Esimerkki:[28]
string message = format("The answer is {}.", 42);
Concepts
[muokkaa | muokkaa wikitekstiä]ISO:n tekninen määrittely: ISO/IEC TS 19217:2015[37] GCC-kääntäjän versiossa 6 on tukea ominaisuudelle.[38] Standardimallikirjasto sisältää ominaisuutta tukevia määrittelyitä.[39]
Concepts on laajennus template-malleihin, jotka voivat toimia rajoitteina sallituille argumenteille tai parametreille. Constraint-rajoitteella voidaan valita ylikuormitukset ja erikoistumiset. Concepts toimii nimettynä joukkona rajoitteita, jotka arvioidaan käännösaikana.[40] Tavoitteena on semanttisen tarkistuksen lisääminen syntaksitarkistuksen lisänä.[40][41] Ominaisuuden on sanottu olevan puuttuva ominaisuus geneerisen ohjelmoinnin haittapuolien eliminoimiseksi.[42]
Kielen nimettyjä vaatimuksia voidaan esittää Concepts-kirjaston avulla.[43][40] Esimerkiksi std::hash
-tuen vaatimuskonsepti Hashable
voidaan ilmaista:[40]
template<typename T>
concept Hashable = requires(T a) {
{ std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;
};
Ranges
[muokkaa | muokkaa wikitekstiä]Eric Nieblerin esimerkkitoteutus on julkaistu osana ehdotusta ominaisuuden lisäämiseksi C++ standardiin ja on myöhemmin hyväksytty standardiin std::ranges
-kirjastoksi.[44]
Kirjasto rakentuu Concepts-kirjaston ominaisuuksille.[45]
Toteutus on koottava abstraktiokerros iteraattoreiden päällä.[44]
Kirjasto tukee Haskell-kielen tapaan laiskaa arviointia, jossa ääretöntä määrää tukevasta toiminnosta suoritetaan vain tarvittava osa.[46] Esimerkiksi kokonaislukujoukosta [1, ..] voidaan valita viisi numeroa ja tulostaa ne seuraavasti:[46]
auto num = view::take(view::ints(1), 5);
ranges::for_each(num, [](int i){ std::cout << i << " "; });
Esimerkki (std::views
on lyhenne std::ranges::views
nimiavaruudelle):[47]
std::vector<int> ints{0,1,2,3,4,5};
auto even = [](int i){ return 0 == i % 2; };
auto square = [](int i) { return i * i; };
for (int i : ints | std::views::filter(even) | std::views::transform(square)) {
std::cout << i << ' ';
}
.. joka tulostaa annettujen arvojen joukosta (0..5) parillisten numeroiden (0, 2, 4) neliöt seuraavasti:
0 4 16
Coroutines
[muokkaa | muokkaa wikitekstiä]Coroutines on ylemmän tason kielien kuten Simulan ominaisuus, joka toimii vaihtoehtona aliohjelmille (alifunktioille): rutiinit ovat pinottomia.[48][49] Coroutines on tarkoitettu tilanteisiin, jossa eri funktiot vaihtavat suoritusvuoroaan jatkaen aiemmasta tilasta.[48] Coroutines sallii funktion suorittamisen pysäyttämisen ja jatkamisen ja lisää kolme uutta operaattoria:[28]
co_await
, pysäyttää väliaikaisesti suorituksen palauttamatta arvoa kutsujalleco_yield
, pysäyttää väliaikaisesti ja palauttaa arvon kutsujalleco_return
, lopettaa suorituksen ja palauttaa arvon.
Uudet operaattorit mahdollistavat asynkronisen suorituksen, generaattorit ja laiskat funktiot.[28]
Esimerkki:[28]
generator<int> iota(int n = 0) {
while(true)
co_yield n++;
}
Boost-kirjastossa on esimerkkitoteutus C++:lle.[50] Coroutines on hyväksytty mukaan C++20:een.[51][28]
Moduulit
[muokkaa | muokkaa wikitekstiä]Moduulit (modules) on vaihtoehtoinen tapa otsikkotiedostoille, joka muun muassa mahdollistaa makrojen eriyttämisen.[51] Aiemmin ohjelmoijille on ollut mahdollista käyttää kolmea nimettyä kapselointia:[51]
- muuttujanimi
- funktionimi
- luokkanimi
Moduulit lisäävät neljännen nimetyn kapseloinnin, joka sisältää kaikki kolme aikaisempaa yhdessä.[51] Moduulit on hyväksytty mukaan C++20:een.[51]
Epävirallinen tuki toiminnolle on ollut aiemmin Clang-kääntäjässä.[52][53]
Esimerkki:[54]
// moduulissa:
// helloworld.cpp
export module helloworld; // module declaration
import <iostream>; // import declaration
export void hello() { // export declaration
std::cout << "Hello world!\n";
}
// moduulin käyttö:
// main.cpp
import helloworld; // import declaration
int main() {
hello();
}
Lähteet
[muokkaa | muokkaa wikitekstiä]- ↑ a b Current Status isocpp.org. Viitattu 8.5.2017.
- ↑ a b c d Bjarne Stroustrup on C++20's significance isocpp.org. 21.2.2020. Viitattu 25.2.2020. (englanniksi)
- ↑ Tim Anderson: Classy move: C++ 20 wins final approval in ISO technical ballot, formal publication expected by end of year theregister.com. 7.9.2020. Viitattu 7.9.2020. (englanniksi)
- ↑ ISO/IEC 14882:2020 Programming languages — C++ iso.org. joulukuu 2020. Viitattu 28.1.2023. (englanniksi)
- ↑ To boldly suggest an overall plan for C++23 open-std.org. 25.11.2019. Viitattu 11.3.2020. (englanniksi)
- ↑ Changes between C++17 and C++20 DIS open-std.org. Viitattu 24.3.2020. (englanniksi)
- ↑ Working Draft, Extensions to C++ for Modules open-std.org. Viitattu 8.5.2017.
- ↑ Extensions for parallelism en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
- ↑ Extensions for parallelism, version 2 en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
- ↑ Extensions for concurrency en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
- ↑ P1135R6 The C++20 Synchronization Library open-std.org. 19.7.2019. Viitattu 25.2.2020. (englanniksi)
- ↑ C++ Latches and Barriers open-std.org. Viitattu 17.5.2017.
- ↑ Revised Latches and Barriers for C++20 (PDF) open-std.org. Viitattu 25.2.2020. (englanniksi)
- ↑ Concepts Are Ready open-std.org. Viitattu 8.5.2017.
- ↑ Programming Languages — C++ Extensions for Concepts open-std.org. Viitattu 17.5.2017.
- ↑ Working Draft, C++ Extensions for Ranges open-std.org. Viitattu 8.5.2017.
- ↑ Working Draft, Technical Specification for C++ Extensions for Coroutines open-std.org. Viitattu 8.5.2017.
- ↑ Wording for lambdas in unevaluated contexts (PDF) open-std.org. Viitattu 21.1.2018.
- ↑ Thomas Köppe: Allow lambda capture [=, this] open-std.org. 4.3.2017. Viitattu 25.2.2020. (englanniksi)
- ↑ Consistent comparison (PDF) open-std.org. Viitattu 21.1.2018.
- ↑ P1152R4 Deprecating volatile open-std.org. Viitattu 25.2.2020. (englanniksi)
- ↑ std::span en.cppreference.com. (englanniksi)
- ↑ Feature testing en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
- ↑ P0553R4: Bit operations open-std.org. Viitattu 25.2.2020. (englanniksi)
- ↑ Standard library header <bit> en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
- ↑ Functional in C++17 and C++20 modernescpp.com. Viitattu 8.5.2017.
- ↑ Bjarne Stroustrup: Remember the Vasa! (PDF) open-std.org. 6.3.2018. Viitattu 27.7.2018.
- ↑ a b c d e f g C++20 Feature List Now Frozen: Modules, Coroutines, and Concepts are in; Contracts out infoq.com. (englanniksi)
- ↑ Support for contract based programming in C++ open-std.org. Viitattu 25.2.2020. (englanniksi)
- ↑ Working Draft, C++ Extensions for Networking open-std.org. Viitattu 8.5.2017. (englanniksi)
- ↑ a b Experimental C++ Features en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
- ↑ Static reflection open-std.org. Viitattu 25.2.2020. (englanniksi)
- ↑ Transactional Language Constructs for C++ open-std.org. Viitattu 8.5.2017.
- ↑ Transactional memory en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
- ↑ a b The Day The Standard Library Died cor3ntin.github.io. 24.2.2020. Viitattu 25.2.2020. (englanniksi)
- ↑ Titus Winters: ABI - Now or Never (PDF) open-std.org. 9.1.2020. Viitattu 25.2.2020. (englanniksi)
- ↑ ISO/IEC TS 19217:2015 International Organization for Standardization.
- ↑ GCC 6 Release Series Changes, New Features, and Fixes gcc.gnu.org. Viitattu 17.5.2017.
- ↑ Concepts library en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
- ↑ a b c d Constraints and concepts en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
- ↑ C++20: Concepts, the Details modernescpp.com. Viitattu 25.2.2020. (englanniksi)
- ↑ The C++20 Concepts is the missing feature to eliminate the generics paradigm drawbacks. cppdepend.com. Viitattu 25.2.2020. (englanniksi)
- ↑ Named requirements en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
- ↑ a b Range-v3 ericniebler.github.io. Viitattu 25.2.2020. (englanniksi)
- ↑ The One Ranges Proposal (PDF) open-std.org. Viitattu 25.2.2020. (englanniksi)
- ↑ a b The New Ranges Library modernescpp.com. Viitattu 25.2.2020. (englanniksi)
- ↑ Ranges library en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
- ↑ a b Chisnall, David: Influential Programming Languages, Part 2: Simula informit.com. Viitattu 17.5.2017.
- ↑ Coroutines en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
- ↑ Chapter 1. Coroutine boost.org. Viitattu 17.5.2017.
- ↑ a b c d e Herb Sutter: Trip report: Winter ISO C++ standards meeting (Kona) herbsutter.com. 23.2.2019. Viitattu 3.7.2019. (englanniksi)
- ↑ Clang 5 documentation clang.llvm.org. Viitattu 8.5.2017.
- ↑ Larabel, Michael: Facebook Has Been Working On C++ Modules Support For GCC Phoronix. Viitattu 9.10.2017.
- ↑ Modules en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
Aiheesta muualla
[muokkaa | muokkaa wikitekstiä]- Standardivedokset (englanniksi)