constinit Specifier in C++ 20

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 <iostream>
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 <iostream>
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 <iostream>
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.
Comment