Constexpr

constexpr  on C++11 -ohjelmointikielistandardissa käyttöön otettu tyyppimäärittäjä , joka ilmaisee vakiolausekkeita , jotka voidaan arvioida koodin käännösaikana [1] . Aluksi C++11-kielistandardi asetti käytölle useita merkittäviä ehtoja ja rajoituksia, mutta suurin osa niistä poistettiin C++14 -standardin julkaisun jälkeen [2] .

Kuvaus

Määrittelijä , joka on samanlainen kuin C++98constexpr :sta peritty määrittäjä , voidaan käyttää muuttujien suhteen , mutta niiden lisäksi sitä voidaan käyttää myös funktiomäärittelyissä ja luokkakonstruktoreissa . Mahdollisten toimenpiteiden ilmoittaminen spesifikaattorilla tarkoittaa, että niiden arviointi voidaan suorittaa yksinkertaistetusti koodin käännösvaiheessa. Tämä asettaa heille useita merkittäviä rajoituksia, esimerkiksi dynaamisen muistin käytön kieltäminen tai poikkeusten heittäminen [3] . Lisäksi palautusarvon laskentaconstconstexprconstexpr-funktio on taattu käännösaikana vain, jos sen argumentit ovat vakiolausekkeita ja konteksti, jossa palautusarvoa käytetään, sallii käännösaikavakion olemassaolon. Muussa tapauksessa funktio laskee palautusarvonsa koodin suoritusvaiheessa [4] .

-konstruktoreiden ilmoituksen constexprtulee olla triviaali, ja niiden kutsumisen tulos on käännöshetkellä luotuja vain luku -objekteja [5] . Toisin kuin constexpr-lausekkeet, määritteen kanssa ilmoitetut vakiot constvoidaan alustaa ajon aikana [4] .

C++14-standardista constexprlähtien -funktiot ovat pystyneet käyttämään sisäisesti useimpia tavallisen C++-koodin [6] ohjausrakenteita .

C++11- ja C++14-standardeissa käytettäessä staattisia constexprluokan jäseniä niiden deklaraatiota luokan rungossa piti täydentää sen constexprulkopuolella olevien -muuttujien määritelmällä. C++17 -standardista alkaen on kuitenkin pidetty luokan sisällä olevien -muuttujien constexprmäärittelyä niiden määritelmänä ja ulkopuolisia lisämäärityksiä on käsitelty redundanttina [7] .

Standardin C++17 -versiossa kaikki lambda-funktiot , jotka täyttävät constexpr-funktioiden ehdot, sijoitetaan implisiittisesti constexpr-lausekeluokkaan [5] .

Muistiinpanot

  1. constexpr specifier (alkaen C++11) Arkistoitu 25. maaliskuuta 2019 osoitteessa Wayback Machine cppreference.com
  2. Vandewoerd, Josattis, Gregor, 2018 , Computing with constexpr, s. 161.
  3. Vandewoerd, Josattis, Gregor, 2018 , Computing with constexpr, s. 161-162.
  4. 1 2 Olsson, 2018 , Constant Expressions, s. 129.
  5. 1 2 Olsson, 2018 , Constant Expressions, s. 130.
  6. Vandewoerd, Josattis, Gregor, 2018 , Computing with constexpr, s. 162.
  7. Vandewoerd, Josattis, Gregor, 2018 , C++11-, C++14- ja C++17-standardit, s. 33.

Lähteet