C++14: can you call new in a constexpr?
c++, c++11, c++14, language-lawyer
Solution
Language lawyer answer. All references to N3797.
7.1.5/5 states:
For a non-template, non-defaulted `constexpr` function or a non-template, non-defaulted, non-inheriting `constexpr` constructor, if no argument values exist such that an invocation of the function or constructor could be an evaluated subexpression of a core constant expression (5.19), the program is ill-formed; no diagnostic required.
Jumping over to 5.19, we see:
A conditional-expression `e` is a core constant expression unless the evaluation of `e`, following the rules of the abstract machine (1.9), would evaluate one of the following expressions:
... [lots of bullets]...
a new-expression (5.3.4);
a delete-expression (5.3.5);
... [lots more bullets]...
So no: a program containing a `constexpr` function with an unconditional invocation of `new` or `delete` in it is ill-formed, no diagnostic required. (I'd be surprised, however, if any half-decent compiler failed to diagnose such invocations of `new` or `delete` in a `constexpr` function, required or not.)
Problem
When C++14 lifted restrictions on `constexpr` it seemed to include the following (copied from Wikipedia): Expressions may change the value of an object if the lifetime of that object began within the constant expression function. This includes calls to any non-const constexpr-declared non-static member functions. That seems to imply that you could create an object using `new` and as long as you `delete` it within the expression, then it would be allowed.