Constexpr

A constexpr  a C++11 programozási nyelvi szabványban bevezetett típusspecifikátor a kódfordítási időben kiértékelhető konstans kifejezések jelölésére [1] . Kezdetben a C++11 nyelvi szabvány számos jelentős feltételt és korlátozást támasztott a használatára vonatkozóan, de ezek többsége a C++14 szabvány megjelenése után megszűnt [2] .

Leírás

A specifikátor, hasonlóan a C++98constexpr - ból örökölt specifikátorhoz , használható változókra vonatkozóan , de ezek mellett függvénydeklarációkban és osztálykonstruktorokban is használható . Bármely eljárás specifikálóval történő deklarálása azt jelenti, hogy azok kiértékelése egyszerűsített módon elvégezhető a kódösszeállítás szakaszában. Ez számos jelentős korlátozást ró rájuk, például a dinamikus memória használatának megengedhetetlensége vagy a kivételek dobása [3] . Ezenkívül a visszatérési érték kiszámításaconstconstexprconstexprA -függvény csak akkor garantált a fordítási időben, ha argumentumai konstans kifejezések, és a visszatérési érték felhasználási környezete lehetővé teszi a fordítási idő állandó jelenlétét. Ellenkező esetben a függvény kiszámítja a visszatérési értékét a kódvégrehajtás szakaszában [4] .

A -konstruktorok deklarációjának constexprtriviálisnak kell lennie, és a meghívásuk eredménye a fordítási időben létrehozott csak olvasható objektumok [5] . A constexpr-kifejezésekkel ellentétben a specifikátorral deklarált konstansok constfutás közben inicializálhatók [4] .

A C++14 szabvány óta a constexpr-függvények képesek voltak belsőleg használni a legtöbb szabályos C++ kód [6] vezérlőstruktúráját .

A C++11 és C++14 szabványban statikus constexprosztálytagok használatakor az osztálytörzsben való deklarációjukat ki kellett volna egészíteni a constexprrajta kívüli -változók definíciójával. A C++17 szabványtól kezdve azonban az osztályon belüli -változók deklarációját constexprtekintettük definíciójuknak, és minden további definíciót kívül redundánsnak [7] .

A szabvány C++17 változatában minden lambda függvény , amely megfelel a constexpr-függvények feltételeinek, implicit módon a constexpr-kifejezési osztályba kerül [5] .

Jegyzetek

  1. constexpr specifikáció (a C++11 óta) Archivált 2019. március 25-én a Wayback Machine cppreference.com oldalán
  2. Vandewoerd, Josattis, Gregor, 2018 , Computing with constexpr, p. 161.
  3. Vandewoerd, Josattis, Gregor, 2018 , Computing with constexpr, p. 161-162.
  4. 1 2 Olsson, 2018 , Állandó kifejezések, p. 129.
  5. 1 2 Olsson, 2018 , Állandó kifejezések, p. 130.
  6. Vandewoerd, Josattis, Gregor, 2018 , Computing with constexpr, p. 162.
  7. Vandewoerd, Josattis, Gregor, 2018 , The C++11, C++14, and C++17 Standards, 1. o. 33.

Források