constexpr je specifikátor typu zavedený ve standardu programovacího jazyka C++11 k označení konstantních výrazů , které lze vyhodnotit v době kompilace kódu [1] . Jazykový standard C++11 zpočátku kladl na jeho používání řadu významných podmínek a omezení, ale většina z nich byla po vydání standardu C++14 odstraněna [2] .
Specifikátor , podobný specifikátoru constexprzděděnému z C++98const , lze použít s ohledem na proměnné , ale kromě nich jej lze použít také v deklaracích funkcí a konstruktorech tříd . Deklarování jakýchkoli procedur pomocí specifikátoru constexprznamená, že jejich vyhodnocení může být provedeno zjednodušeným způsobem ve fázi kompilace kódu. To jim ukládá řadu výrazných omezení, například nepřípustnost používání dynamické paměti nebo házení výjimek [3] . Kromě toho je vyhodnocení constexprnávratové hodnoty funkce -funkce v době kompilace zaručeno pouze v případě, že její argumenty jsou konstantní výrazy a kontext použití návratové hodnoty umožňuje přítomnost konstanty v době kompilace. V opačném případě funkce vypočítá svou návratovou hodnotu ve fázi provádění kódu [4] .
Deklarace constexpr-constructors by měla být triviální a výsledkem jejich volání budou objekty pouze pro čtení vytvořené v době kompilace [5] . Na rozdíl od constexpr-expressions lze konstanty deklarované se specifikátorem constinicializovat za běhu [4] .
Od standardu C++14 constexprbyly -funkce schopny interně používat většinu řídicích struktur běžného kódu C++ [6] .
Ve standardech C++11 a C++14 constexprměla být při použití statických členů třídy jejich deklarace v těle třídy doplněna o definici constexpr-proměnných mimo něj. Nicméně počínaje standardem C++17 byla deklarace constexpr-proměnných uvnitř třídy považována za jejich definici a jakákoli další definice vně byla považována za nadbytečnou [7] .
V revizi standardu C++17 jsou všechny funkce lambda , které splňují podmínky pro constexpr-funkce, implicitně umístěny do třídy constexpr-expression [5] .