constinit Specifier in C++ 20 (original) (raw)
Last Updated : 10 Jun, 2026
The constinit specifier was introduced in C++20 to guarantee that variables with static or thread storage duration are initialized before program execution begins.
- Prevents unintended runtime initialization
- Ensures initialization occurs during the static initialization phase
- Does not make a variable immutable C++ `
#include using namespace std;
// Declare a constinit variable constinit int x = 42;
int main() { cout << "x = " << x << endl; return 0; }
`
**Output
x = 42
**Explanation
- x is declared using the constinit specifier.
- The value 42 is a constant expression.
- Initialization occurs before program execution begins.
Syntax
constinit T variable = initializer;
**Where:
- **T: It indicates the type of variable
- **variable: It is the name of the variable
- **initializer: It is the constant expression that is used for the initialization.
Rules and Restrictions of constinit
The constinit specifier has the following requirements:
- Can only be applied to variables with static or thread storage duration.
- The variable must be initialized with a constant expression or a constant-initialized constructor.
- It guarantees compile-time initialization but does not make the variable constant.
- The variable can still be modified after initialization.
- constinit cannot be combined with constexpr.
- constinit cannot be combined with consteval.
**Note: Unlike constexpr, constinit only guarantees initialization at compile time; it does not require the variable to remain constant throughout the program.
Example: constinit with constexpr
The following code is invalid because constinit and constexpr cannot be used together.
C++ `
#include using namespace std;
// Error: constinit cannot be used with constexpr constinit constexpr int x = 42;
int main() { cout << x << std::endl; return 0; }
`
**Error
Example: constinit with consteval
The following code is invalid because constinit applies to variables, whereas consteval applies to functions.
C++ `
#include using namespace std;
// Error: constinit cannot be used with consteval constinit consteval int square(int x) { return x * x; }
int main() { cout << square(5) << std::endl; return 0; }
`
**Error
Advantages of constinit
Using constinit provides the following benefits:
- **Guaranteed Initialization: Ensures variables are initialized before program execution begins.
- **Improved Reliability: Reduces the risk of using uninitialized or partially initialized variables.
- **Prevents Runtime Initialization: Detects initialization issues during compilation.
- **Better Control of Static Initialization: Helps avoid problems related to the static initialization order.