constexpr este un specificator de tip introdus în standardul limbajului de programare C++11 pentru a denota expresii constante care pot fi evaluate la momentul compilarii codului [1] . Inițial, standardul limbajului C++11 a impus o serie de condiții și restricții semnificative privind utilizarea sa, dar cele mai multe dintre ele au fost eliminate după lansarea standardului C++14 [2] .
Specificatorul , similar cu specificatorul constexprmoștenit din C++98const , poate fi folosit cu privire la variabile , cu toate acestea, pe lângă acestea, poate fi folosit și în declarațiile de funcții și constructorii de clasă . Declararea oricăror proceduri cu un specificator constexprînseamnă că evaluarea acestora poate fi efectuată într-o manieră simplificată în etapa de compilare a codului. Acest lucru le impune o serie de restricții semnificative, de exemplu, inadmisibilitatea utilizării memoriei dinamice sau aruncarea de excepții [3] . În plus, evaluarea în timp de compilare constexpra valorii returnate a unei funcții este garantată numai dacă argumentele acesteia sunt expresii constante, iar contextul de utilizare al valorii returnate permite prezența unei constante de timp de compilare. În caz contrar, funcția își va calcula valoarea returnată în etapa de execuție a codului [4] .
Declarația constexpr-constructorilor ar trebui să fie banală, iar rezultatul apelării acestora va fi obiecte numai în citire create în timpul compilării [5] . Spre deosebire constexprde -expresii, constantele declarate cu specificatorul constpot fi inițializate la runtime [4] .
Începând cu standardul C++14 constexpr, -funcțiile au putut folosi majoritatea structurilor de control ale codului C++ obișnuit [6] intern .
În standardele C++11 și C++14, atunci când se folosesc constexprmembri statici de clasă, declarația lor în corpul clasei trebuia să fie completată de definiția constexpr-variabilelor din afara acesteia. Totuși, pornind de la standardul C++17 , declarația constexpr-variabilelor din interiorul clasei a fost considerată drept definiție, iar orice definiție suplimentară din exterior a fost tratată ca redundantă [7] .
În revizuirea C++17 a standardului , toate funcțiile lambda care îndeplinesc condițiile pentru constexpr-funcții sunt plasate implicit în clasa constexpr-expression [5] .