C++20
From Wikipedia, the free encyclopedia
Remove ads
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]
Remove ads
Kehityskohdat
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
- 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]
Remove ads
std::format
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
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
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
Remove ads
Coroutines
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]
Remove ads
Moduulit
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();
}
Remove ads
Lähteet
Aiheesta muualla
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads