I really can\'t find any use of it. My first idea was that I could use it to implement \'Design by Contract\' without using macros like this:
struct S
{
S
The goal of constexpr
depends on the context:
For objects it indicates that the object is immutable and shall be constructed at compile-time. Aside from moving operations to compile-time rather than doing them at run-time creating constexpr
objects has the added advantage that they are initialize before any threads are created. As a result, their access never needs any synchronization. An example of declaring an object as constexpr
would look like this:
constexpr T value{args};
Obviously, for that to work, args
need to be constant expressions.
For functions it indicates that calling the function can result in a constant expression. Whether the result of constexpr
function call results in a constant expression depends on the arguments and the definition of the function. The immediate implication is that the function has to be inline
(it will implicitly be made so). In addition, there are constraints on what can be done within such a function. For C++11 the function can have only one statement which, for non-constructors, has to be a return
-statement. This restriction got relaxed in C++14. For example, the following is a definition of a constexpr
function:
constexpr int square(int value) { return value * value; }
When creating constexpr
object of non-built-in types the respective types will need a constexpr
constructor: the generated default constructor won't work. Obviously, a constexpr
constructor will need to initialize all members. A constexpr
constructor could look like this:
struct example {
int value;
constexpr example(int value): value(value) {}
};
int main() {
constexpr example size{17};
int array[size.value] = {};
}
The created constexpr
values can be used everywhere a constant expression is expected.