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(constexpr int i) : S(i) { static_assert( i < 9, "i must be < 9" ); }
S(int i); //external defintion
char *pSomeMemory;
};
But this wouldn't compile. I thought we could also use it to reference same-variable without the need of additional memory to be created when we want to avoid the get/setters in order to make instances to one member from users to be read-only:
class S
{
private:
int _i;
public:
const int & constexpr i = _i;
};
But none of the above actually compiled. Can someone give me some insight why this keyword was being introduced?
Best Answer
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 asconstexpr
would look like this: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 beinline
(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 areturn
-statement. This restriction got relaxed in C++14. For example, the following is a definition of aconstexpr
function:When creating
constexpr
object of non-built-in types the respective types will need aconstexpr
constructor: the generated default constructor won't work. Obviously, aconstexpr
constructor will need to initialize all members. Aconstexpr
constructor could look like this:The created
constexpr
values can be used everywhere a constant expression is expected.