Constexpr

constexpr  er en typespecifikation introduceret i C++11 -programmeringssprogstandarden for at angive konstante udtryk , der kan evalueres på kodekompileringstidspunktet [1] . Oprindeligt pålagde sprogstandarden C++11 en række væsentlige betingelser og begrænsninger for dens brug, men de fleste af dem blev fjernet efter udgivelsen af ​​C++14 -standarden [2] .

Beskrivelse

Specifikatoren , svarende til specifieren constexprarvet fra C++98const , kan bruges med hensyn til variabler , men udover dem kan den også bruges i funktionserklæringer og klassekonstruktører . Erklæring af procedurer med en specifikator constexprbetyder, at deres evaluering kan udføres på en forenklet måde på stadiet af kodekompilering. Dette pålægger dem en række væsentlige begrænsninger, f.eks. at det ikke er tilladt at bruge dynamisk hukommelse eller at smide undtagelser [3] . Derudover er kompileringstidsevaluering af en constexpr-funktions returværdi kun garanteret, hvis dens argumenter er konstante udtryk, og returneringsværdiens brugskontekst tillader tilstedeværelsen af ​​en kompileringstidskonstant. Ellers vil funktionen beregne sin returværdi på tidspunktet for kodeudførelse [4] .

Deklarationen constexpraf ​​-konstruktører bør være triviel, og resultatet af at kalde dem vil være skrivebeskyttede objekter oprettet på kompileringstidspunktet [5] . I modsætning til constexpr-udtryk kan konstanter deklareret med specifikationen constinitialiseres ved kørsel [4] .

Siden C++14-standarden constexprhar -funktioner været i stand til at bruge de fleste af kontrolstrukturerne i almindelig C++-kode [6] internt .

I C++11- og C++14-standarderne, ved brug af statiske constexprklassemedlemmer, skulle deres erklæring i klassekroppen suppleres med definitionen constexpraf ​​-variabler uden for den. Men med udgangspunkt i C++17 -standarden er deklarationen constexpraf ​​-variabler inde i klassen blevet betragtet som deres definition, og enhver yderligere definition udenfor er blevet behandlet som overflødig [7] .

I C++17 - revisionen af ​​standarden er alle lambda-funktioner , der opfylder betingelserne for constexpr-funktioner, implicit placeret i constexpr-udtryksklassen [5] .

Noter

  1. constexpr specifier (siden C++11) Arkiveret 25. marts 2019 på 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 , The C++11, C++14, and C++17 Standards, s. 33.

Kilder