This question is a followup question to C++17: still using enums as constants?.
Legacy constants come in several forms, notably:
#define CONSTANT x
enum { CONSTANT = x };
const /*int/unsigned/whatever*/ CONSTANT = x;
A comment about static constexpr
and inline constexpr
constants as a replacement got me thinking on the subject of updating our many, many legacy constants (particularly #define
constants).
As I understand, an inline constexpr
value is basically just substituted in place, like an inlined function (which I've been shown to be wrong about). Conversely, a static constexpr
value is stored as part of the binary in a separate area. Assuming I understand correctly, when should one be preferred over the other? My hunch is that, for integral constants, inline constexpr
will generally be preferred.
Best Answer
Your go-to for global constants in C++17 should just be:
This gets you a nice, first-class variable that you can use in constant expressions and that won't have ODR-issues. You can take references to it.
Macros bring in the problem of... being macros. Enums are limited to integral types. With
constexpr
variables, you can have them of any literal type. In C++20, you'll very likely be able to just go wild and write:It is the only option that allows this.