Files
2025-10-25 03:02:53 +03:00

594 lines
27 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[dcl.init.general]
# 9 Declarations [[dcl]](./#dcl)
## 9.5 Initializers [[dcl.init]](dcl.init#general)
### 9.5.1 General [dcl.init.general]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L4912)
The process of initialization described in [[dcl.init]](dcl.init "9.5Initializers") applies to
all initializations regardless of syntactic context, including the
initialization of a function parameter ([[expr.call]](expr.call "7.6.1.3Function call")), the
initialization of a return value ([[stmt.return]](stmt.return "8.8.4The return statement")), or when an
initializer follows a declarator[.](#1.sentence-1)
[initializer:](#nt:initializer "9.5.1General[dcl.init.general]")
[*brace-or-equal-initializer*](#nt:brace-or-equal-initializer "9.5.1General[dcl.init.general]")
( [*expression-list*](expr.post.general#nt:expression-list "7.6.1.1General[expr.post.general]") )
[brace-or-equal-initializer:](#nt:brace-or-equal-initializer "9.5.1General[dcl.init.general]")
= [*initializer-clause*](#nt:initializer-clause "9.5.1General[dcl.init.general]")
[*braced-init-list*](#nt:braced-init-list "9.5.1General[dcl.init.general]")
[initializer-clause:](#nt:initializer-clause "9.5.1General[dcl.init.general]")
[*assignment-expression*](expr.assign#nt:assignment-expression "7.6.19Assignment and compound assignment operators[expr.assign]")
[*braced-init-list*](#nt:braced-init-list "9.5.1General[dcl.init.general]")
[braced-init-list:](#nt:braced-init-list "9.5.1General[dcl.init.general]")
{ [*initializer-list*](#nt:initializer-list "9.5.1General[dcl.init.general]") ,opt }
{ [*designated-initializer-list*](#nt:designated-initializer-list "9.5.1General[dcl.init.general]") ,opt }
{ }
[initializer-list:](#nt:initializer-list "9.5.1General[dcl.init.general]")
[*initializer-clause*](#nt:initializer-clause "9.5.1General[dcl.init.general]") ...opt
[*initializer-list*](#nt:initializer-list "9.5.1General[dcl.init.general]") , [*initializer-clause*](#nt:initializer-clause "9.5.1General[dcl.init.general]") ...opt
[designated-initializer-list:](#nt:designated-initializer-list "9.5.1General[dcl.init.general]")
[*designated-initializer-clause*](#nt:designated-initializer-clause "9.5.1General[dcl.init.general]")
[*designated-initializer-list*](#nt:designated-initializer-list "9.5.1General[dcl.init.general]") , [*designated-initializer-clause*](#nt:designated-initializer-clause "9.5.1General[dcl.init.general]")
[designated-initializer-clause:](#nt:designated-initializer-clause "9.5.1General[dcl.init.general]")
[*designator*](#nt:designator "9.5.1General[dcl.init.general]") [*brace-or-equal-initializer*](#nt:brace-or-equal-initializer "9.5.1General[dcl.init.general]")
[designator:](#nt:designator "9.5.1General[dcl.init.general]")
. [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")
[expr-or-braced-init-list:](#nt:expr-or-braced-init-list "9.5.1General[dcl.init.general]")
[*expression*](expr.comma#nt:expression "7.6.20Comma operator[expr.comma]")
[*braced-init-list*](#nt:braced-init-list "9.5.1General[dcl.init.general]")
[*Note [1](#note-1)*:
The rules in [[dcl.init]](dcl.init "9.5Initializers") apply even if the grammar permits only
the [*brace-or-equal-initializer*](#nt:brace-or-equal-initializer "9.5.1General[dcl.init.general]") form
of [*initializer*](#nt:initializer "9.5.1General[dcl.init.general]") in a given context[.](#1.sentence-2)
— *end note*]
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L4978)
Except for objects declared with the constexpr specifier, for which see [[dcl.constexpr]](dcl.constexpr "9.2.6The constexpr and consteval specifiers"),
an [*initializer*](#nt:initializer "9.5.1General[dcl.init.general]") in the definition of a variable can consist of
arbitrary expressions involving literals and previously declared
variables and functions,
regardless of the variable's storage duration[.](#2.sentence-1)
[*Example [1](#example-1)*: int f(int);int a = 2;int b = f(a);int c(b); — *end example*]
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L4993)
[*Note [2](#note-2)*:
Default arguments are more restricted; see [[dcl.fct.default]](dcl.fct.default "9.3.4.7Default arguments")[.](#3.sentence-1)
— *end note*]
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L4998)
[*Note [3](#note-3)*:
The order of initialization of variables with static storage duration is described in [[basic.start]](basic.start "6.10.3Start and termination") and [[stmt.dcl]](stmt.dcl "8.10Declaration statement")[.](#4.sentence-1)
— *end note*]
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5004)
A declaration D of a variable with linkage
shall not have an [*initializer*](#nt:initializer "9.5.1General[dcl.init.general]") if D inhabits a block scope[.](#5.sentence-1)
[6](#6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5009)
To [*zero-initialize*](#def:zero-initialization "9.5.1General[dcl.init.general]") an object or reference of type T means:
- [(6.1)](#6.1)
if T is std::meta::info,
the object is initialized to a null reflection value;
- [(6.2)](#6.2)
if T is any other scalar type ([[basic.types.general]](basic.types.general#term.scalar.type "6.9.1General")),
the object is initialized to the value
obtained by converting the integer literal 0 (zero) to T;[78](#footnote-78 "As specified in [conv.ptr], converting an integer literal whose value is 0 to a pointer type results in a null pointer value.")
- [(6.3)](#6.3)
ifT is a (possibly cv-qualified) non-union class type,
its padding bits ([[basic.types.general]](basic.types.general#term.padding.bits "6.9.1General")) are initialized to zero bits and
each non-static data member,
each non-virtual base class subobject, and,
if the object is not a base class subobject,
each virtual base class subobject
is zero-initialized;
- [(6.4)](#6.4)
ifT is a (possibly cv-qualified) union type,
its padding bits ([[basic.types.general]](basic.types.general#term.padding.bits "6.9.1General")) are initialized to zero bits and
the
object's first non-static named
data member
is zero-initialized;
- [(6.5)](#6.5)
ifT is an array type,
each element is zero-initialized;
- [(6.6)](#6.6)
ifT is a reference type, no initialization is performed[.](#6.sentence-1)
[7](#7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5062)
To[*default-initialize*](#def:default-initialization "9.5.1General[dcl.init.general]") an object of typeT means:
- [(7.1)](#7.1)
IfT is a (possibly cv-qualified) class type ([[class]](class "11Classes")),
constructors are considered[.](#7.1.sentence-1)
The applicable constructors are
enumerated ([[over.match.ctor]](over.match.ctor "12.2.2.4Initialization by constructor")), and the best one for the[*initializer*](#nt:initializer "9.5.1General[dcl.init.general]") () is chosen through
overload resolution ([[over.match]](over.match "12.2Overload resolution"))[.](#7.1.sentence-2)
The constructor thus selected
is called, with an empty argument list, to initialize the object[.](#7.1.sentence-3)
- [(7.2)](#7.2)
IfT is an array type,
the semantic constraints of default-initializing a hypothetical element
shall be met and
each element is default-initialized[.](#7.2.sentence-1)
- [(7.3)](#7.3)
If T is std::meta::info, the object is zero-initialized[.](#7.3.sentence-1)
- [(7.4)](#7.4)
Otherwise,
no initialization is performed[.](#7.4.sentence-1)
[8](#8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5095)
A class type T is [*const-default-constructible*](#def:const-default-constructible "9.5.1General[dcl.init.general]") if
default-initialization of T would invoke
a user-provided constructor of T (not inherited from a base class)
or if
- [(8.1)](#8.1)
each direct non-variant non-static data member M of T has a default member initializer
or, if M is of class type X (or array thereof),X is const-default-constructible,
- [(8.2)](#8.2)
if T is a union with at least one non-static data member,
exactly one variant member has a default member initializer,
- [(8.3)](#8.3)
if T is not a union,
for each anonymous union member with at least one non-static data member (if any),
exactly one non-static data member has a default member initializer, and
- [(8.4)](#8.4)
each potentially constructed base class of T is const-default-constructible[.](#8.sentence-1)
If a program calls for the default-initialization of an object of a
const-qualified type T,T shall be std::meta::
info or a const-default-constructible class type,
or array thereof[.](#8.sentence-2)
[9](#9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5123)
To[*value-initialize*](#def:value-initialization "9.5.1General[dcl.init.general]") an object of typeT means:
- [(9.1)](#9.1)
IfT is a (possibly cv-qualified) class type ([[class]](class "11Classes")), then
let C be the constructor selected to
default-initialize the object, if any[.](#9.1.sentence-1)
If C is not user-provided, the object is first zero-initialized[.](#9.1.sentence-2)
In all cases, the object is then default-initialized[.](#9.1.sentence-3)
- [(9.2)](#9.2)
IfT is an array type,
the semantic constraints of value-initializing a hypothetical element
shall be met and
each element is value-initialized[.](#9.2.sentence-1)
- [(9.3)](#9.3)
Otherwise, the object is zero-initialized[.](#9.3.sentence-1)
[10](#10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5152)
A program that calls for default-initialization
or value-initialization
of an entity
of reference type is ill-formed[.](#10.sentence-1)
[11](#11)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5158)
[*Note [4](#note-4)*:
For every object with static storage duration,
static initialization ([[basic.start.static]](basic.start.static "6.10.3.2Static initialization")) is performed
at program startup before any other initialization takes place[.](#11.sentence-1)
In some cases, additional initialization is done later[.](#11.sentence-2)
— *end note*]
[12](#12)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5166)
If no initializer is specified for an object, the object is default-initialized[.](#12.sentence-1)
[13](#13)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5169)
If the entity being initialized does not have class or array type, the[*expression-list*](expr.post.general#nt:expression-list "7.6.1.1General[expr.post.general]") in a
parenthesized initializer shall be a single expression[.](#13.sentence-1)
[14](#14)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5174)
The initialization that occurs in the = form of a[*brace-or-equal-initializer*](#nt:brace-or-equal-initializer "9.5.1General[dcl.init.general]") or[*condition*](stmt.pre#nt:condition "8.1Preamble[stmt.pre]") ([[stmt.select]](stmt.select "8.5Selection statements")),
as well as in argument passing, function return,
throwing an exception ([[except.throw]](except.throw "14.2Throwing an exception")),
handling an exception ([[except.handle]](except.handle "14.4Handling an exception")),
and aggregate member initialization other than by a[*designated-initializer-clause*](#nt:designated-initializer-clause "9.5.1General[dcl.init.general]") ([[dcl.init.aggr]](dcl.init.aggr "9.5.2Aggregates")),
is called[*copy-initialization*](#def:copy-initialization "9.5.1General[dcl.init.general]")[.](#14.sentence-1)
[*Note [5](#note-5)*:
Copy-initialization can invoke a move ([[class.copy.ctor]](class.copy.ctor "11.4.5.3Copy/move constructors"))[.](#14.sentence-2)
— *end note*]
[15](#15)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5191)
The initialization that occurs
- [(15.1)](#15.1)
for an [*initializer*](#nt:initializer "9.5.1General[dcl.init.general]") that is a
parenthesized [*expression-list*](expr.post.general#nt:expression-list "7.6.1.1General[expr.post.general]") or a [*braced-init-list*](#nt:braced-init-list "9.5.1General[dcl.init.general]"),
- [(15.2)](#15.2)
for a [*new-initializer*](expr.new#nt:new-initializer "7.6.2.8New[expr.new]") ([[expr.new]](expr.new "7.6.2.8New")),
- [(15.3)](#15.3)
in a static_cast expression ([[expr.static.cast]](expr.static.cast "7.6.1.9Static cast")),
- [(15.4)](#15.4)
in a functional notation type conversion ([[expr.type.conv]](expr.type.conv "7.6.1.4Explicit type conversion (functional notation)")), and
- [(15.5)](#15.5)
in the [*braced-init-list*](#nt:braced-init-list "9.5.1General[dcl.init.general]") form of a [*condition*](stmt.pre#nt:condition "8.1Preamble[stmt.pre]")
is called[*direct-initialization*](#def:direct-initialization "9.5.1General[dcl.init.general]")[.](#15.sentence-1)
[16](#16)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5204)
The semantics of initializers are as follows[.](#16.sentence-1)
The[*destination type*](#def:destination_type) is the cv-unqualified type of the object or reference being initialized and the[*source type*](#def:source_type) is the type of the initializer expression[.](#16.sentence-2)
If the initializer is not a single (possibly parenthesized) expression, the
source type is not defined[.](#16.sentence-3)
- [(16.1)](#16.1)
If the initializer is a (non-parenthesized) [*braced-init-list*](#nt:braced-init-list "9.5.1General[dcl.init.general]") or is = [*braced-init-list*](#nt:braced-init-list "9.5.1General[dcl.init.general]"), the object or reference
is list-initialized ([[dcl.init.list]](dcl.init.list "9.5.5List-initialization"))[.](#16.1.sentence-1)
- [(16.2)](#16.2)
If the destination type is a reference type, see [[dcl.init.ref]](dcl.init.ref "9.5.4References")[.](#16.2.sentence-1)
- [(16.3)](#16.3)
If the destination type is an array of characters,
an array of char8_t,
an array of char16_t,
an array of char32_t,
or an array ofwchar_t,
and the initializer is a [*string-literal*](lex.string#nt:string-literal "5.13.5String literals[lex.string]"), see [[dcl.init.string]](dcl.init.string "9.5.3Character arrays")[.](#16.3.sentence-1)
- [(16.4)](#16.4)
If the initializer is (), the object is value-initialized[.](#16.4.sentence-1)
[*Note [6](#note-6)*:
Since() is not permitted by the syntax for[*initializer*](#nt:initializer "9.5.1General[dcl.init.general]"),X a(); is not the declaration of an object of classX,
but the declaration of a function taking no arguments and returning anX[.](#16.4.sentence-2)
The form() can appear in certain other initialization contexts ([[expr.new]](expr.new "7.6.2.8New"), [[expr.type.conv]](expr.type.conv "7.6.1.4Explicit type conversion (functional notation)"), [[class.base.init]](class.base.init "11.9.3Initializing bases and members"))[.](#16.4.sentence-3)
— *end note*]
- [(16.5)](#16.5)
Otherwise, if the destination type is an array,
the object is initialized as follows[.](#16.5.sentence-1)
The [*initializer*](#nt:initializer "9.5.1General[dcl.init.general]") shall be of the form( [*expression-list*](expr.post.general#nt:expression-list "7.6.1.1General[expr.post.general]") )[.](#16.5.sentence-2)
Let x1, …, xk be
the elements of the [*expression-list*](expr.post.general#nt:expression-list "7.6.1.1General[expr.post.general]")[.](#16.5.sentence-3)
If the destination type is an array of unknown bound,
it is defined as having k elements[.](#16.5.sentence-4)
Let n denote the array size after this potential adjustment[.](#16.5.sentence-5)
If k is greater than n,
the program is ill-formed[.](#16.5.sentence-6)
Otherwise, the ith array element is copy-initialized withxi for each 1 ≤ i ≤ k, and
value-initialized for each k<‰¤n[.](#16.5.sentence-7)
For each ‰¤i<‰¤n,
every value computation and side effect associated with
the initialization of the ith element of the array
is sequenced before those associated with
the initialization of the jth element[.](#16.5.sentence-8)
- [(16.6)](#16.6)
Otherwise, if the destination type is a class type:
* [(16.6.1)](#16.6.1)
If the initializer expression is a prvalue
and the cv-unqualified version of the source type
is the same as the destination type,
the initializer expression is used to initialize the destination object[.](#16.6.1.sentence-1)
[*Example [2](#example-2)*:
T x = T(T(T())); value-initializes x[.](#16.6.1.sentence-2)
— *end example*]
* [(16.6.2)](#16.6.2)
Otherwise, if the initialization is direct-initialization,
or if it is copy-initialization where the cv-unqualified version of the source
type is the same as or is derived from the class of the destination type,
constructors are considered[.](#16.6.2.sentence-1)
The applicable constructors
are enumerated ([[over.match.ctor]](over.match.ctor "12.2.2.4Initialization by constructor")), and the best one is chosen
through overload resolution ([[over.match]](over.match "12.2Overload resolution"))[.](#16.6.2.sentence-2)
Then:
+
[(16.6.2.1)](#16.6.2.1)
If overload resolution is successful,
the selected constructor
is called to initialize the object, with the initializer
expression or [*expression-list*](expr.post.general#nt:expression-list "7.6.1.1General[expr.post.general]") as its argument(s)[.](#16.6.2.1.sentence-1)
+
[(16.6.2.2)](#16.6.2.2)
Otherwise, if no constructor is viable,
the destination type is
an aggregate class, and
the initializer is a parenthesized [*expression-list*](expr.post.general#nt:expression-list "7.6.1.1General[expr.post.general]"),
the object is initialized as follows[.](#16.6.2.2.sentence-1)
Let e1, …, en be the elements of the aggregate ([[dcl.init.aggr]](dcl.init.aggr "9.5.2Aggregates"))[.](#16.6.2.2.sentence-2)
Let x1, …, xk be the elements of the [*expression-list*](expr.post.general#nt:expression-list "7.6.1.1General[expr.post.general]")[.](#16.6.2.2.sentence-3)
If k is greater than n, the program is ill-formed[.](#16.6.2.2.sentence-4)
The element ei is copy-initialized withxi for 1 ≤ i ≤ k[.](#16.6.2.2.sentence-5)
The remaining elements are initialized with
their default member initializers, if any, and
otherwise are value-initialized[.](#16.6.2.2.sentence-6)
For each ‰¤i<‰¤n,
every value computation and side effect
associated with the initialization of ei is sequenced before those associated with the initialization of ej[.](#16.6.2.2.sentence-7)
[*Note [7](#note-7)*:
By contrast with direct-list-initialization,
narrowing conversions ([[dcl.init.list]](dcl.init.list "9.5.5List-initialization")) can appear,
designators are not permitted,
a temporary object bound to a reference
does not have its lifetime extended ([[class.temporary]](class.temporary "6.8.7Temporary objects")), and
there is no brace elision[.](#16.6.2.2.sentence-8)
[*Example [3](#example-3)*: struct A {int a; int&& r;};
int f();int n = 10;
A a1{1, f()}; // OK, lifetime is extended A a2(1, f()); // well-formed, but dangling reference A a3{1.0, 1}; // error: narrowing conversion A a4(1.0, 1); // well-formed, but dangling reference A a5(1.0, std::move(n)); // OK — *end example*]
— *end note*]
+
[(16.6.2.3)](#16.6.2.3)
Otherwise, the initialization is ill-formed[.](#16.6.2.3.sentence-1)
* [(16.6.3)](#16.6.3)
Otherwise (i.e., for the remaining copy-initialization cases),
user-defined conversions that can convert from the
source type to the destination type or (when a conversion function
is used) to a derived class thereof are enumerated as described in [[over.match.copy]](over.match.copy "12.2.2.5Copy-initialization of class by user-defined conversion"),
and the best one is chosen through overload resolution ([[over.match]](over.match "12.2Overload resolution"))[.](#16.6.3.sentence-1)
If the conversion cannot be done or
is ambiguous, the initialization is ill-formed[.](#16.6.3.sentence-2)
The function
selected is called with the initializer expression as its
argument; if the function is a constructor, the call is a prvalue
of the cv-unqualified version of the
destination type whose result object is initialized by the constructor[.](#16.6.3.sentence-3)
The call is used
to direct-initialize, according to the rules above, the object
that is the destination of the copy-initialization[.](#16.6.3.sentence-4)
- [(16.7)](#16.7)
Otherwise, if the source type
is a (possibly cv-qualified) class type, conversion functions are
considered[.](#16.7.sentence-1)
The applicable conversion functions are enumerated ([[over.match.conv]](over.match.conv "12.2.2.6Initialization by conversion function")),
and the best one is chosen through overload
resolution ([[over.match]](over.match "12.2Overload resolution"))[.](#16.7.sentence-2)
The user-defined conversion so selected
is called to convert the initializer expression into the
object being initialized[.](#16.7.sentence-3)
If the conversion cannot be done or is
ambiguous, the initialization is ill-formed[.](#16.7.sentence-4)
- [(16.8)](#16.8)
Otherwise, if the initialization is direct-initialization,
the source type is std::nullptr_t, and
the destination type is bool,
the initial value of the object being initialized is false[.](#16.8.sentence-1)
- [(16.9)](#16.9)
Otherwise, the initial value of the object being initialized is
the (possibly converted) value of the initializer expression[.](#16.9.sentence-1)
A standard conversion sequence ([[conv]](conv "7.3Standard conversions")) is used
to convert the initializer expression to
a prvalue of
the destination type;
no user-defined conversions are considered[.](#16.9.sentence-2)
If the conversion cannot
be done, the initialization is ill-formed[.](#16.9.sentence-3)
When initializing a bit-field with a value that it cannot represent, the
resulting value of the bit-field isimplementation-defined[.](#16.9.sentence-4)
[*Note [8](#note-8)*:
An expression of type
“*cv1* €
can initialize an object of type
“*cv2* €
independently of
the cv-qualifiers*cv1* and *cv2*[.](#16.9.sentence-5)
int a;const int b = a;int c = b; — *end note*]
[17](#17)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5407)
An immediate invocation ([[expr.const]](expr.const "7.7Constant expressions")) that is not evaluated where
it appears ([[dcl.fct.default]](dcl.fct.default "9.3.4.7Default arguments"), [[class.mem.general]](class.mem.general "11.4.1General"))
is evaluated and checked for whether it is
a constant expression at the point where
the enclosing [*initializer*](#nt:initializer "9.5.1General[dcl.init.general]") is used in
a function call, a constructor definition, or an aggregate initialization[.](#17.sentence-1)
[18](#18)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5415)
An [*initializer-clause*](#nt:initializer-clause "9.5.1General[dcl.init.general]") followed by an ellipsis is a
pack expansion ([[temp.variadic]](temp.variadic "13.7.4Variadic templates"))[.](#18.sentence-1)
[19](#19)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5419)
Initialization includes
the evaluation of all subexpressions of
each [*initializer-clause*](#nt:initializer-clause "9.5.1General[dcl.init.general]") of
the initializer (possibly nested within [*braced-init-list*](#nt:braced-init-list "9.5.1General[dcl.init.general]")*s*) and
the creation of any temporary objects for
function arguments or return values ([[class.temporary]](class.temporary "6.8.7Temporary objects"))[.](#19.sentence-1)
[20](#20)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5427)
If the initializer is a parenthesized [*expression-list*](expr.post.general#nt:expression-list "7.6.1.1General[expr.post.general]"),
the expressions are evaluated in the order
specified for function calls ([[expr.call]](expr.call "7.6.1.3Function call"))[.](#20.sentence-1)
[21](#21)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5432)
The same [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]") shall not appear in multiple [*designator*](#nt:designator "9.5.1General[dcl.init.general]")*s* of a[*designated-initializer-list*](#nt:designated-initializer-list "9.5.1General[dcl.init.general]")[.](#21.sentence-1)
[22](#22)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5437)
An object whose initialization has completed
is deemed to be constructed,
even if the object is of non-class type or
no constructor of the object's class
is invoked for the initialization[.](#22.sentence-1)
[*Note [9](#note-9)*:
Such an object might have been value-initialized
or initialized by aggregate initialization ([[dcl.init.aggr]](dcl.init.aggr "9.5.2Aggregates"))
or by an inherited constructor ([[class.inhctor.init]](class.inhctor.init "11.9.4Initialization by inherited constructor"))[.](#22.sentence-2)
— *end note*]
Destroying an object of class type invokes the destructor of the class[.](#22.sentence-3)
Destroying a scalar type has no effect other than
ending the lifetime of the object ([[basic.life]](basic.life "6.8.4Lifetime"))[.](#22.sentence-4)
Destroying an array destroys each element in reverse subscript order[.](#22.sentence-5)
[23](#23)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L5453)
A declaration that specifies the initialization of a variable,
whether from an explicit initializer or by default-initialization,
is called the [*initializing declaration*](#def:initializing_declaration "9.5.1General[dcl.init.general]") of that variable[.](#23.sentence-1)
[*Note [10](#note-10)*:
In most cases
this is the defining declaration ([[basic.def]](basic.def "6.2Declarations and definitions")) of the variable,
but the initializing declaration
of a non-inline static data member ([[class.static.data]](class.static.data "11.4.9.3Static data members"))
can be the declaration within the class definition
and not the definition (if any) outside it[.](#23.sentence-2)
— *end note*]
[78)](#footnote-78)[78)](#footnoteref-78)
As specified in [[conv.ptr]](conv.ptr "7.3.12Pointer conversions"), converting an integer
literal whose value is0 to a pointer type results in a null pointer value[.](#footnote-78.sentence-1)