constexpr specifier (since C++11)


constexpr
 specifies that the value of a variable or function can appear in constant expressions

Contents 
[edit] Explanation
The constexpr
specifier declares that it is possible to evaluate the value of the function or variable at compile time. Such variables and functions can then be used where only compile time constant expressions are allowed (provided that appropriate function arguments are given). A constexpr specifier used in an object declaration implies const. A constexpr specifier used in a function declaration implies inline.
A constexpr variable must satisfy the following requirements:

 its type must be a
LiteralType
.  it must be immediately constructed or assigned a value.
 the constructor parameters or the value to be assigned must contain only literal values,
constexpr
variables and functions.  the constructor used to construct the object (either implicit or explicit) must satisfy the requirements of
constexpr
constructor. In the case of explicit constructor, it must have constexpr specified.
 its type must be a
A constexpr function must satisfy the following requirements:

 it must not be virtual
 its return type must be
LiteralType
 each of its parameters must be literal type
 there exists at least one argument value such that an invocation of the function could be an evaluated subexpression of a core constant expression (for constexpr function templates, at least one specialization must satisfy this requirement , for constructors, use in a constant initializer is sufficient) (since C++14))

(until C++14) 

(since C++14) 
A constexpr constructor must satisfy the following requirements:

 each of its parameters must be literal type
 the class must have no virtual base classes
 the constructor must not have a functiontryblock

(until C++14) 

(since C++14) 
[edit] Notes
Because the noexcept operator always returns true
for a constant expression, it can be used to check if a particular invocation of a constexpr function takes the constant expression branch:
constexpr int f(); constexpr bool b1 = noexcept(f()); // false, undefined constexpr function constexpr int f() { return 0; } constexpr bool b2 = noexcept(f()); // true, f() is a constant expression
Constexpr constructors are permitted for classes that aren't literal types. For example, the default constructor of std::unique_ptr is constexpr, allowing constant initialization.
[edit] Keywords
[edit] Example
Definition of a C++11 constexpr function which computes factorials and a literal type that extends string literals:
#include <iostream> #include <stdexcept> // C++11 constexpr functions use recursion rather than iteration // (C++14 constexpr functions may use local variables and loops) constexpr int factorial(int n) { return n <= 1? 1 : (n * factorial(n  1)); } // literal class class conststr { const char* p; std::size_t sz; public: template<std::size_t N> constexpr conststr(const char(&a)[N]): p(a), sz(N  1) {} // constexpr functions signal errors by throwing exceptions // in C++11, they must do so from the conditional operator ?: constexpr char operator[](std::size_t n) const { return n < sz? p[n] : throw std::out_of_range(""); } constexpr std::size_t size() const { return sz; } }; // C++11 constexpr functions had to put everything in a single return statement // (C++14 doesn't have that requirement) constexpr std::size_t countlower(conststr s, std::size_t n = 0, std::size_t c = 0) { return n == s.size()? c : s[n] >= 'a' && s[n] <= 'z'? countlower(s, n + 1, c + 1) : countlower(s, n + 1, c); } // output function that requires a compiletime constant, for testing template<int n> struct constN { constN() { std::cout << n << '\n'; } }; int main() { std::cout << "4! = " ; constN<factorial(4)> out1; // computed at compile time volatile int k = 8; // disallow optimization using volatile std::cout << k << "! = " << factorial(k) << '\n'; // computed at run time std::cout << "the number of lowercase letters in \"Hello, world!\" is "; constN<countlower("Hello, world!")> out2; // implicitly converted to conststr }
Output:
4! = 24 8! = 40320 the number of lowercase letters in "Hello, world!" is 9
[edit] Defect reports
The following behaviorchanging defect reports were applied retroactively to previously published C++ standards.
DR  Applied to  Behavior as published  Correct behavior 

CWG 1911  c++14  constexpr constructors for nonliteral types were not allowed  allowed in constant initialization 
CWG 2004  c++14  assignment of a union with a mutable member was allowed in a constant expression  mutable variants disqualify implicit copy/move 