Constant initialization
Sets the initial values of the static variables to a compile-time constant.
Explanation
Constant initialization is performed in the following cases:
|
(until C++11) |
|
(since C++11) (until C++17) |
|
(since C++17) (until C++20) |
|
(since C++20) |
The effects of constant initialization are the same as the effects of the corresponding initialization, except that it is guaranteed that it is complete before any other initialization of a static or thread-local(since C++11) object begins.
Notes
The compiler is permitted to initialize other static and thread-local(since C++11) objects using constant initialization, if it can guarantee that the value would be the same as if the standard order of initialization was followed.
Constant initialization usually happens when the program loads into memory, as part of initializing the program's runtime environment.
Example
#include <iostream>
#include <array>
struct S
{
static const int c;
};
const int d = 10 * S::c; // not a constant expression: S::c has no preceding
// initializer, this initialization happens after const
const int S::c = 5; // constant initialization, guaranteed to happen first
int main()
{
std::cout << "d = " << d << '\n';
std::array<int, S::c> a1; // OK: S::c is a constant expression
// std::array<int, d> a2; // error: d is not a constant expression
}
Output:
d = 50
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
