General topics | ||||||||||||||||||||||||||
Flow control | ||||||||||||||||||||||||||
Conditional execution statements | ||||||||||||||||||||||||||
Iteration statements (loops) | ||||||||||||||||||||||||||
Jump statements | ||||||||||||||||||||||||||
Functions | ||||||||||||||||||||||||||
Function declaration | ||||||||||||||||||||||||||
Lambda function expression | ||||||||||||||||||||||||||
inline specifier | ||||||||||||||||||||||||||
Dynamic exception specifications(until C++17*) | ||||||||||||||||||||||||||
noexcept specifier(C++11) | ||||||||||||||||||||||||||
Exceptions | ||||||||||||||||||||||||||
Namespaces | ||||||||||||||||||||||||||
Types | ||||||||||||||||||||||||||
Specifiers | ||||||||||||||||||||||||||
| ||||||||||||||||||||||||||
Storage duration specifiers | ||||||||||||||||||||||||||
Initialization | ||||||||||||||||||||||||||
|
Expressions | ||||||||||||||||
Alternative representations | ||||||||||||||||
Literals | ||||||||||||||||
Boolean -Integer -Floating-point | ||||||||||||||||
Character -String -nullptr(C++11) | ||||||||||||||||
User-defined(C++11) | ||||||||||||||||
Utilities | ||||||||||||||||
Attributes(C++11) | ||||||||||||||||
Types | ||||||||||||||||
typedef declaration | ||||||||||||||||
Type alias declaration(C++11) | ||||||||||||||||
Casts | ||||||||||||||||
Memory allocation | ||||||||||||||||
Classes | ||||||||||||||||
Class-specific function properties | ||||||||||||||||
| ||||||||||||||||
Special member functions | ||||||||||||||||
Templates | ||||||||||||||||
Miscellaneous | ||||||||||||||||
Sets the initial values of thestatic variables to a compile-time constant.
Contents |
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.
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.
#include <iostream>#include <array> struct S{staticconstint c;}; constint d=10* S::c;// not a constant expression: S::c has no preceding// initializer, this initialization happens after constconstint 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
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
CWG 441 | C++98 | references could not be constant initialized | made constant initializable |
CWG 1489 | C++11 | it was unclear whether value-initializing an object can be a constant initialization | it can |
CWG 1747 | C++11 | binding a reference to a function could not be constant initialization | it can |
CWG 1834 | C++11 | binding a reference to an xvalue could not be constant initialization | it can |