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 | ||||||||||||||||
This is the initialization performed when an object is constructed with an empty initializer.
Contents |
T() | (1) | ||||||||
new T() | (2) | ||||||||
Class:: Class( ...) : member() { ...} | (3) | ||||||||
Tobject{}; | (4) | (since C++11) | |||||||
T{} | (5) | (since C++11) | |||||||
new T{} | (6) | (since C++11) | |||||||
Class:: Class( ...) : member{} { ...} | (7) | (since C++11) | |||||||
Value-initialization is performed in these situations:
In all cases, if the empty pair of braces{}
is used andT
is an aggregate type,aggregate initialization is performed instead of value-initialization.
If | (since C++11) |
The effects of value-initialization are:
T
is a (possibly cv-qualified) class type:T
selects aconstructor, and the constructor is notuser-declared(until C++11)user-provided(since C++11), the object is firstzero-initialized.T
is an array type, each element of the array is value-initialized.The syntaxT object(); does not initialize an object; it declares a function that takes no arguments and returnsT
. The way to value-initialize a named variable before C++11 wasT object= T();, which value-initializes a temporary and then copy-initializes the object: most compilersoptimize out the copy in this case.
References cannot be value-initialized.
As described infunction-style cast, the syntaxT()(1) is prohibited ifT
names an array type, whileT{}(5) is allowed.
All standard containers (std::vector,std::list, etc.) value-initialize their elements when constructed with a singlesize_type
argument or when grown by a call toresize(), unless their allocator customizes the behavior ofconstruct.
#include <cassert>#include <iostream>#include <string>#include <vector> struct T1{int mem1;std::string mem2;virtualvoid foo(){}// make sure T1 is not an aggregate};// implicit default constructor struct T2{int mem1;std::string mem2; T2(const T2&){}// user-provided copy constructor};// no default constructor struct T3{int mem1;std::string mem2; T3(){}// user-provided default constructor}; std::string s{};// class => default-initialization, the value is "" int main(){int n{};// scalar => zero-initialization, the value is 0assert(n==0);double f=double();// scalar => zero-initialization, the value is 0.0assert(f==0.0);int* a= newint[10]();// array => value-initialization of each elementassert(a[9]==0);// the value of each element is 0 T1 t1{};// class with implicit default constructor =>assert(t1.mem1==0);// t1.mem1 is zero-initialized, the value is 0assert(t1.mem2=="");// t1.mem2 is default-initialized, the value is ""// T2 t2{}; // error: class with no default constructor T3 t3{};// class with user-provided default constructor =>std::cout<< t3.mem1;// t3.mem1 is default-initialized to indeterminate valueassert(t3.mem2=="");// t3.mem2 is default-initialized, the value is ""std::vector<int> v(3);// value-initialization of each elementassert(v[2]==0);// the value of each element is 0std::cout<<'\n'; delete[] a;}
Possible output:
42
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
CWG 178 | C++98 | there was no value-initialization; empty initializer invoked default- initialization (thoughnew T() also performs zero-initialization) | empty initializer invoke value-initialization |
CWG 543 | C++98 | value-initialization for a class object without any user-provided constructors was equivalent to value- initializing each subobject (which need not zero- initialize a member with user-provided default constructor) | zero-initializes the entire object, then calls the default constructor |
CWG 1301 | C++11 | value-initialization of unions with deleted default constructors led to zero-initialization | they are default-initialized |
CWG 1368 | C++98 | any user-provided constructor caused zero-initialization to be skipped | only a user-provided default constructor skips zero-initialization |
CWG 1502 | C++11 | value-initializing a union without a user-provided default constructor only zero-initialized the object, despite default member initializers | performs default- initialization after zero-initialization |
CWG 1507 | C++98 | value-initialization for a class object without any user-provided constructors did not check the validity of the default constructor when the latter is trivial | the validity of trivial default constructor is checked |
CWG 2820 | C++98 | the default-initialization following the zero- initialization required a non-trivial constructor | not required |
CWG 2859 | C++98 | value-initialization for a class object might involve zero-initialization even if the default-initialization does not actually select a user-provided constructor | there is no zero-initialization in this case |