Difference between revisions of "cpp/language/zero initialization"
(Added CWG issue #277 DR.) |
m (→See also: teletyped `new`) |
||
Line 96: | Line 96: | ||
** {{rlp|value initialization}} | ** {{rlp|value initialization}} | ||
* {{rlp|move assignment}} | * {{rlp|move assignment}} | ||
− | * {{ | + | * {{rlpt|new}} |
{{langlinks|de|es|fr|it|ja|pt|ru|zh}} | {{langlinks|de|es|fr|it|ja|pt|ru|zh}} |
Revision as of 13:59, 26 January 2022
Sets the initial value of an object to zero.
Contents |
Syntax
Note that this is not the syntax for zero initialization, which does not have a dedicated syntax in the language. These are examples of other types of initializations, which might perform zero initialization.
static T object ;
|
(1) | ||||||||
T () ;
T t |
(2) | (since C++11) | |||||||
CharT array [ n ] = "";
|
(3) | ||||||||
Explanation
Zero initialization is performed in the following situations:
The effects of zero initialization are:
- If
T
is a scalar type, the object's initial value is the integral constant zero explicitly converted toT
.
- If
T
is an non-union class type, all base classes and non-static data members are zero-initialized, and all padding is initialized to zero bits. The constructors, if any, are ignored.
- If
T
is a union type, the first non-static named data member is zero-initialized and all padding is initialized to zero bits.
- If
T
is array type, each element is zero-initialized.
- If
T
is reference type, nothing is done.
Notes
As described in non-local initialization, static and thread-local(since C++11) variables that aren't constant-initialized are zero-initialized before any other initialization takes place. If the definition of a non-class non-local variable has no initializer, then default initialization does nothing, leaving the result of the earlier zero-initialization unmodified.
A zero-initialized pointer is the null pointer value of its type, even if the value of the null pointer is not integral zero.
Example
#include <string> #include <iostream> struct A { int a, b, c; }; double f[3]; // zero-initialized to three 0.0's int* p; // zero-initialized to null pointer value // (even if the value is not integral 0) std::string s; // zero-initialized to indeterminate value, then // default-initialized to "" by the std::string default constructor int main(int argc, char*[]) { delete p; // safe to delete a null pointer static int n = argc; // zero-initialized to 0 then copy-initialized to argc std::cout << "n = " << n << '\n'; A a = A(); // the effect is same as: A a{}; or A a = {}; std::cout << "a = {" << a.a << ' ' << a.b << ' ' << a.c << "}\n"; }
Possible output:
n = 1 a = {0 0 0}
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
CWG 277 | C++98 | pointers might be initialized with a non-constant expression of value 0, which is not a null pointer constant |
must initialize with an integral constant expression of value 0 |
CWG 2026 | C++98 | zero initialization was specified to always occur first, even before constant initialization |
no zero initialization if constant initialization applies |