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]

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

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 kutsujalle
  • co_yield, pysäyttää väliaikaisesti ja palauttaa arvon kutsujalle
  • co_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]

  1. muuttujanimi
  2. funktionimi
  3. 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

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads