From Jason Turner

[basic.start.term]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmp752vbr9h/{from.md → to.md} +392 -24
tmp/tmp752vbr9h/{from.md → to.md} RENAMED
@@ -1,24 +1,21 @@
1
- ### Termination <a id="basic.start.term">[[basic.start.term]]</a>
2
 
3
- Destructors ([[class.dtor]]) for initialized objects (that is, objects
4
- whose lifetime ([[basic.life]]) has begun) with static storage
5
- duration, and functions registered with `std::atexit`, are called as
6
- part of a call to `std::exit` ([[support.start.term]]). The call to
7
- `std::exit` is sequenced before the invocations of the destructors and
8
- the registered functions.
9
 
10
- [*Note 1*: Returning from `main` invokes `std::exit` (
11
- [[basic.start.main]]). — *end note*]
12
 
13
- Destructors for initialized objects with thread storage duration within
14
- a given thread are called as a result of returning from the initial
15
- function of that thread and as a result of that thread calling
16
- `std::exit`. The completions of the destructors for all initialized
17
- objects with thread storage duration within that thread strongly happen
18
- before the initiation of the destructors of any object with static
19
- storage duration.
20
 
21
  If the completion of the constructor or dynamic initialization of an
22
  object with static storage duration strongly happens before that of
23
  another, the completion of the destructor of the second is sequenced
24
  before the initiation of the destructor of the first. If the completion
@@ -29,12 +26,12 @@ destructor of the first. If an object is initialized statically, the
29
  object is destroyed in the same order as if the object was dynamically
30
  initialized. For an object of array or class type, all subobjects of
31
  that object are destroyed before any block-scope object with static
32
  storage duration initialized during the construction of the subobjects
33
  is destroyed. If the destruction of an object with static or thread
34
- storage duration exits via an exception, `std::terminate` is called (
35
- [[except.terminate]]).
36
 
37
  If a function contains a block-scope object of static or thread storage
38
  duration that has been destroyed and the function is called during the
39
  destruction of an object with static or thread storage duration, the
40
  program has undefined behavior if the flow of control passes through the
@@ -42,26 +39,26 @@ definition of the previously destroyed block-scope object. Likewise, the
42
  behavior is undefined if the block-scope object is used indirectly
43
  (i.e., through a pointer) after its destruction.
44
 
45
  If the completion of the initialization of an object with static storage
46
  duration strongly happens before a call to `std::atexit` (see
47
- `<cstdlib>`,  [[support.start.term]]), the call to the function passed
48
- to `std::atexit` is sequenced before the call to the destructor for the
49
  object. If a call to `std::atexit` strongly happens before the
50
  completion of the initialization of an object with static storage
51
  duration, the call to the destructor for the object is sequenced before
52
  the call to the function passed to `std::atexit`. If a call to
53
  `std::atexit` strongly happens before another call to `std::atexit`, the
54
  call to the function passed to the second `std::atexit` call is
55
  sequenced before the call to the function passed to the first
56
  `std::atexit` call.
57
 
58
  If there is a use of a standard library object or function not permitted
59
- within signal handlers ([[support.runtime]]) that does not happen
60
- before ([[intro.multithread]]) completion of destruction of objects
61
- with static storage duration and execution of `std::atexit` registered
62
- functions ([[support.start.term]]), the program has undefined behavior.
63
 
64
  [*Note 2*: If there is a use of an object with static storage duration
65
  that does not happen before the object’s destruction, the program has
66
  undefined behavior. Terminating every thread before a call to
67
  `std::exit` or the exit from `main` is sufficient, but not necessary, to
@@ -70,5 +67,376 @@ static-storage-duration objects. — *end note*]
70
 
71
  Calling the function `std::abort()` declared in `<cstdlib>` terminates
72
  the program without executing any destructors and without calling the
73
  functions passed to `std::atexit()` or `std::at_quick_exit()`.
74
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #### Termination <a id="basic.start.term">[[basic.start.term]]</a>
2
 
3
+ Constructed objects [[dcl.init]] with static storage duration are
4
+ destroyed and functions registered with `std::atexit` are called as part
5
+ of a call to `std::exit` [[support.start.term]]. The call to `std::exit`
6
+ is sequenced before the destructions and the registered functions.
 
 
7
 
8
+ [*Note 1*: Returning from `main` invokes `std::exit`
9
+ [[basic.start.main]]. — *end note*]
10
 
11
+ Constructed objects with thread storage duration within a given thread
12
+ are destroyed as a result of returning from the initial function of that
13
+ thread and as a result of that thread calling `std::exit`. The
14
+ destruction of all constructed objects with thread storage duration
15
+ within that thread strongly happens before destroying any object with
16
+ static storage duration.
 
17
 
18
  If the completion of the constructor or dynamic initialization of an
19
  object with static storage duration strongly happens before that of
20
  another, the completion of the destructor of the second is sequenced
21
  before the initiation of the destructor of the first. If the completion
 
26
  object is destroyed in the same order as if the object was dynamically
27
  initialized. For an object of array or class type, all subobjects of
28
  that object are destroyed before any block-scope object with static
29
  storage duration initialized during the construction of the subobjects
30
  is destroyed. If the destruction of an object with static or thread
31
+ storage duration exits via an exception, the function `std::terminate`
32
+ is called [[except.terminate]].
33
 
34
  If a function contains a block-scope object of static or thread storage
35
  duration that has been destroyed and the function is called during the
36
  destruction of an object with static or thread storage duration, the
37
  program has undefined behavior if the flow of control passes through the
 
39
  behavior is undefined if the block-scope object is used indirectly
40
  (i.e., through a pointer) after its destruction.
41
 
42
  If the completion of the initialization of an object with static storage
43
  duration strongly happens before a call to `std::atexit` (see
44
+ `<cstdlib>`, [[support.start.term]]), the call to the function passed to
45
+ `std::atexit` is sequenced before the call to the destructor for the
46
  object. If a call to `std::atexit` strongly happens before the
47
  completion of the initialization of an object with static storage
48
  duration, the call to the destructor for the object is sequenced before
49
  the call to the function passed to `std::atexit`. If a call to
50
  `std::atexit` strongly happens before another call to `std::atexit`, the
51
  call to the function passed to the second `std::atexit` call is
52
  sequenced before the call to the function passed to the first
53
  `std::atexit` call.
54
 
55
  If there is a use of a standard library object or function not permitted
56
+ within signal handlers [[support.runtime]] that does not happen before
57
+ [[intro.multithread]] completion of destruction of objects with static
58
+ storage duration and execution of `std::atexit` registered functions
59
+ [[support.start.term]], the program has undefined behavior.
60
 
61
  [*Note 2*: If there is a use of an object with static storage duration
62
  that does not happen before the object’s destruction, the program has
63
  undefined behavior. Terminating every thread before a call to
64
  `std::exit` or the exit from `main` is sufficient, but not necessary, to
 
67
 
68
  Calling the function `std::abort()` declared in `<cstdlib>` terminates
69
  the program without executing any destructors and without calling the
70
  functions passed to `std::atexit()` or `std::at_quick_exit()`.
71
 
72
+ <!-- Link reference definitions -->
73
+ [allocator.members]: utilities.md#allocator.members
74
+ [allocator.traits.members]: utilities.md#allocator.traits.members
75
+ [atomics]: atomics.md#atomics
76
+ [atomics.flag]: atomics.md#atomics.flag
77
+ [atomics.lockfree]: atomics.md#atomics.lockfree
78
+ [atomics.order]: atomics.md#atomics.order
79
+ [bad.alloc]: support.md#bad.alloc
80
+ [basic]: #basic
81
+ [basic.align]: #basic.align
82
+ [basic.compound]: #basic.compound
83
+ [basic.def]: #basic.def
84
+ [basic.def.odr]: #basic.def.odr
85
+ [basic.exec]: #basic.exec
86
+ [basic.fundamental]: #basic.fundamental
87
+ [basic.fundamental.width]: #basic.fundamental.width
88
+ [basic.funscope]: #basic.funscope
89
+ [basic.indet]: #basic.indet
90
+ [basic.life]: #basic.life
91
+ [basic.link]: #basic.link
92
+ [basic.lookup]: #basic.lookup
93
+ [basic.lookup.argdep]: #basic.lookup.argdep
94
+ [basic.lookup.classref]: #basic.lookup.classref
95
+ [basic.lookup.elab]: #basic.lookup.elab
96
+ [basic.lookup.qual]: #basic.lookup.qual
97
+ [basic.lookup.udir]: #basic.lookup.udir
98
+ [basic.lookup.unqual]: #basic.lookup.unqual
99
+ [basic.lval]: expr.md#basic.lval
100
+ [basic.memobj]: #basic.memobj
101
+ [basic.namespace]: dcl.md#basic.namespace
102
+ [basic.pre]: #basic.pre
103
+ [basic.scope]: #basic.scope
104
+ [basic.scope.block]: #basic.scope.block
105
+ [basic.scope.class]: #basic.scope.class
106
+ [basic.scope.declarative]: #basic.scope.declarative
107
+ [basic.scope.enum]: #basic.scope.enum
108
+ [basic.scope.hiding]: #basic.scope.hiding
109
+ [basic.scope.namespace]: #basic.scope.namespace
110
+ [basic.scope.param]: #basic.scope.param
111
+ [basic.scope.pdecl]: #basic.scope.pdecl
112
+ [basic.scope.temp]: #basic.scope.temp
113
+ [basic.start]: #basic.start
114
+ [basic.start.dynamic]: #basic.start.dynamic
115
+ [basic.start.main]: #basic.start.main
116
+ [basic.start.static]: #basic.start.static
117
+ [basic.start.term]: #basic.start.term
118
+ [basic.stc]: #basic.stc
119
+ [basic.stc.auto]: #basic.stc.auto
120
+ [basic.stc.dynamic]: #basic.stc.dynamic
121
+ [basic.stc.dynamic.allocation]: #basic.stc.dynamic.allocation
122
+ [basic.stc.dynamic.deallocation]: #basic.stc.dynamic.deallocation
123
+ [basic.stc.dynamic.safety]: #basic.stc.dynamic.safety
124
+ [basic.stc.inherit]: #basic.stc.inherit
125
+ [basic.stc.static]: #basic.stc.static
126
+ [basic.stc.thread]: #basic.stc.thread
127
+ [basic.type.qualifier]: #basic.type.qualifier
128
+ [basic.type.qualifier.rel]: #basic.type.qualifier.rel
129
+ [basic.types]: #basic.types
130
+ [bit.cast]: numerics.md#bit.cast
131
+ [c.malloc]: utilities.md#c.malloc
132
+ [class]: class.md#class
133
+ [class.abstract]: class.md#class.abstract
134
+ [class.access]: class.md#class.access
135
+ [class.base.init]: class.md#class.base.init
136
+ [class.bit]: class.md#class.bit
137
+ [class.cdtor]: class.md#class.cdtor
138
+ [class.conv.fct]: class.md#class.conv.fct
139
+ [class.copy.assign]: class.md#class.copy.assign
140
+ [class.copy.ctor]: class.md#class.copy.ctor
141
+ [class.copy.elision]: class.md#class.copy.elision
142
+ [class.default.ctor]: class.md#class.default.ctor
143
+ [class.derived]: class.md#class.derived
144
+ [class.dtor]: class.md#class.dtor
145
+ [class.free]: class.md#class.free
146
+ [class.friend]: class.md#class.friend
147
+ [class.local]: class.md#class.local
148
+ [class.mem]: class.md#class.mem
149
+ [class.member.lookup]: class.md#class.member.lookup
150
+ [class.mfct]: class.md#class.mfct
151
+ [class.mfct.non-static]: class.md#class.mfct.non-static
152
+ [class.name]: class.md#class.name
153
+ [class.nest]: class.md#class.nest
154
+ [class.pre]: class.md#class.pre
155
+ [class.prop]: class.md#class.prop
156
+ [class.qual]: #class.qual
157
+ [class.spaceship]: class.md#class.spaceship
158
+ [class.static]: class.md#class.static
159
+ [class.static.data]: class.md#class.static.data
160
+ [class.temporary]: #class.temporary
161
+ [class.this]: class.md#class.this
162
+ [class.union]: class.md#class.union
163
+ [class.virtual]: class.md#class.virtual
164
+ [conv]: expr.md#conv
165
+ [conv.array]: expr.md#conv.array
166
+ [conv.func]: expr.md#conv.func
167
+ [conv.integral]: expr.md#conv.integral
168
+ [conv.lval]: expr.md#conv.lval
169
+ [conv.mem]: expr.md#conv.mem
170
+ [conv.prom]: expr.md#conv.prom
171
+ [conv.ptr]: expr.md#conv.ptr
172
+ [conv.rank]: #conv.rank
173
+ [conv.rval]: expr.md#conv.rval
174
+ [cpp.predefined]: cpp.md#cpp.predefined
175
+ [cstddef.syn]: support.md#cstddef.syn
176
+ [cstring.syn]: strings.md#cstring.syn
177
+ [dcl.align]: dcl.md#dcl.align
178
+ [dcl.array]: dcl.md#dcl.array
179
+ [dcl.attr]: dcl.md#dcl.attr
180
+ [dcl.attr.nouniqueaddr]: dcl.md#dcl.attr.nouniqueaddr
181
+ [dcl.constexpr]: dcl.md#dcl.constexpr
182
+ [dcl.dcl]: dcl.md#dcl.dcl
183
+ [dcl.decl]: dcl.md#dcl.decl
184
+ [dcl.enum]: dcl.md#dcl.enum
185
+ [dcl.fct]: dcl.md#dcl.fct
186
+ [dcl.fct.def]: dcl.md#dcl.fct.def
187
+ [dcl.fct.def.coroutine]: dcl.md#dcl.fct.def.coroutine
188
+ [dcl.fct.def.general]: dcl.md#dcl.fct.def.general
189
+ [dcl.fct.default]: dcl.md#dcl.fct.default
190
+ [dcl.init]: dcl.md#dcl.init
191
+ [dcl.init.aggr]: dcl.md#dcl.init.aggr
192
+ [dcl.init.list]: dcl.md#dcl.init.list
193
+ [dcl.init.ref]: dcl.md#dcl.init.ref
194
+ [dcl.inline]: dcl.md#dcl.inline
195
+ [dcl.link]: dcl.md#dcl.link
196
+ [dcl.meaning]: dcl.md#dcl.meaning
197
+ [dcl.mptr]: dcl.md#dcl.mptr
198
+ [dcl.name]: dcl.md#dcl.name
199
+ [dcl.pre]: dcl.md#dcl.pre
200
+ [dcl.ptr]: dcl.md#dcl.ptr
201
+ [dcl.ref]: dcl.md#dcl.ref
202
+ [dcl.spec]: dcl.md#dcl.spec
203
+ [dcl.spec.auto]: dcl.md#dcl.spec.auto
204
+ [dcl.stc]: dcl.md#dcl.stc
205
+ [dcl.struct.bind]: dcl.md#dcl.struct.bind
206
+ [dcl.type.elab]: dcl.md#dcl.type.elab
207
+ [dcl.typedef]: dcl.md#dcl.typedef
208
+ [defns.block]: intro.md#defns.block
209
+ [defns.signature]: intro.md#defns.signature
210
+ [defns.signature.templ]: intro.md#defns.signature.templ
211
+ [depr.local]: future.md#depr.local
212
+ [depr.static.constexpr]: future.md#depr.static.constexpr
213
+ [diff.cpp11.basic]: compatibility.md#diff.cpp11.basic
214
+ [enum.udecl]: dcl.md#enum.udecl
215
+ [except.handle]: except.md#except.handle
216
+ [except.pre]: except.md#except.pre
217
+ [except.spec]: except.md#except.spec
218
+ [except.terminate]: except.md#except.terminate
219
+ [except.throw]: except.md#except.throw
220
+ [expr]: expr.md#expr
221
+ [expr.add]: expr.md#expr.add
222
+ [expr.alignof]: expr.md#expr.alignof
223
+ [expr.arith.conv]: expr.md#expr.arith.conv
224
+ [expr.ass]: expr.md#expr.ass
225
+ [expr.await]: expr.md#expr.await
226
+ [expr.call]: expr.md#expr.call
227
+ [expr.cast]: expr.md#expr.cast
228
+ [expr.comma]: expr.md#expr.comma
229
+ [expr.compound]: expr.md#expr.compound
230
+ [expr.cond]: expr.md#expr.cond
231
+ [expr.const]: expr.md#expr.const
232
+ [expr.const.cast]: expr.md#expr.const.cast
233
+ [expr.context]: expr.md#expr.context
234
+ [expr.delete]: expr.md#expr.delete
235
+ [expr.dynamic.cast]: expr.md#expr.dynamic.cast
236
+ [expr.eq]: expr.md#expr.eq
237
+ [expr.log.and]: expr.md#expr.log.and
238
+ [expr.log.or]: expr.md#expr.log.or
239
+ [expr.mptr.oper]: expr.md#expr.mptr.oper
240
+ [expr.new]: expr.md#expr.new
241
+ [expr.pre]: expr.md#expr.pre
242
+ [expr.prim.id]: expr.md#expr.prim.id
243
+ [expr.prim.id.dtor]: expr.md#expr.prim.id.dtor
244
+ [expr.prim.id.qual]: expr.md#expr.prim.id.qual
245
+ [expr.prim.lambda]: expr.md#expr.prim.lambda
246
+ [expr.prim.lambda.capture]: expr.md#expr.prim.lambda.capture
247
+ [expr.prim.lambda.closure]: expr.md#expr.prim.lambda.closure
248
+ [expr.prim.this]: expr.md#expr.prim.this
249
+ [expr.prop]: expr.md#expr.prop
250
+ [expr.ref]: expr.md#expr.ref
251
+ [expr.reinterpret.cast]: expr.md#expr.reinterpret.cast
252
+ [expr.rel]: expr.md#expr.rel
253
+ [expr.sizeof]: expr.md#expr.sizeof
254
+ [expr.static.cast]: expr.md#expr.static.cast
255
+ [expr.sub]: expr.md#expr.sub
256
+ [expr.type.conv]: expr.md#expr.type.conv
257
+ [expr.typeid]: expr.md#expr.typeid
258
+ [expr.unary.op]: expr.md#expr.unary.op
259
+ [get.new.handler]: support.md#get.new.handler
260
+ [headers]: library.md#headers
261
+ [intro.execution]: #intro.execution
262
+ [intro.memory]: #intro.memory
263
+ [intro.multithread]: #intro.multithread
264
+ [intro.object]: #intro.object
265
+ [intro.progress]: #intro.progress
266
+ [intro.races]: #intro.races
267
+ [lex.charset]: lex.md#lex.charset
268
+ [lex.name]: lex.md#lex.name
269
+ [lex.separate]: lex.md#lex.separate
270
+ [locale]: localization.md#locale
271
+ [meta.trans.other]: utilities.md#meta.trans.other
272
+ [module.context]: module.md#module.context
273
+ [module.global.frag]: module.md#module.global.frag
274
+ [module.import]: module.md#module.import
275
+ [module.interface]: module.md#module.interface
276
+ [module.reach]: module.md#module.reach
277
+ [module.unit]: module.md#module.unit
278
+ [multibyte.strings]: library.md#multibyte.strings
279
+ [namespace.def]: dcl.md#namespace.def
280
+ [namespace.memdef]: dcl.md#namespace.memdef
281
+ [namespace.qual]: #namespace.qual
282
+ [namespace.udecl]: dcl.md#namespace.udecl
283
+ [namespace.udir]: dcl.md#namespace.udir
284
+ [new.delete]: support.md#new.delete
285
+ [new.delete.array]: support.md#new.delete.array
286
+ [new.delete.placement]: support.md#new.delete.placement
287
+ [new.delete.single]: support.md#new.delete.single
288
+ [new.handler]: support.md#new.handler
289
+ [over]: over.md#over
290
+ [over.literal]: over.md#over.literal
291
+ [over.match]: over.md#over.match
292
+ [over.oper]: over.md#over.oper
293
+ [over.over]: over.md#over.over
294
+ [ptr.align]: utilities.md#ptr.align
295
+ [ptr.launder]: support.md#ptr.launder
296
+ [replacement.functions]: library.md#replacement.functions
297
+ [special]: class.md#special
298
+ [stmt.block]: stmt.md#stmt.block
299
+ [stmt.dcl]: stmt.md#stmt.dcl
300
+ [stmt.expr]: stmt.md#stmt.expr
301
+ [stmt.goto]: stmt.md#stmt.goto
302
+ [stmt.if]: stmt.md#stmt.if
303
+ [stmt.label]: stmt.md#stmt.label
304
+ [stmt.ranged]: stmt.md#stmt.ranged
305
+ [stmt.return]: stmt.md#stmt.return
306
+ [support.dynamic]: support.md#support.dynamic
307
+ [support.limits]: support.md#support.limits
308
+ [support.runtime]: support.md#support.runtime
309
+ [support.start.term]: support.md#support.start.term
310
+ [support.types]: support.md#support.types
311
+ [temp.deduct.guide]: temp.md#temp.deduct.guide
312
+ [temp.dep]: temp.md#temp.dep
313
+ [temp.dep.candidate]: temp.md#temp.dep.candidate
314
+ [temp.expl.spec]: temp.md#temp.expl.spec
315
+ [temp.explicit]: temp.md#temp.explicit
316
+ [temp.local]: temp.md#temp.local
317
+ [temp.names]: temp.md#temp.names
318
+ [temp.nondep]: temp.md#temp.nondep
319
+ [temp.over]: temp.md#temp.over
320
+ [temp.param]: temp.md#temp.param
321
+ [temp.point]: temp.md#temp.point
322
+ [temp.pre]: temp.md#temp.pre
323
+ [temp.res]: temp.md#temp.res
324
+ [temp.spec]: temp.md#temp.spec
325
+ [temp.type]: temp.md#temp.type
326
+ [thread]: thread.md#thread
327
+ [thread.jthread.class]: thread.md#thread.jthread.class
328
+ [thread.thread.class]: thread.md#thread.thread.class
329
+ [thread.threads]: thread.md#thread.threads
330
+ [util.dynamic.safety]: utilities.md#util.dynamic.safety
331
+
332
+ [^1]: Appearing inside the brace-enclosed *declaration-seq* in a
333
+ *linkage-specification* does not affect whether a declaration is a
334
+ definition.
335
+
336
+ [^2]: An implementation is not required to call allocation and
337
+ deallocation functions from constructors or destructors; however,
338
+ this is a permissible implementation technique.
339
+
340
+ [^3]: This refers to unqualified names that occur, for instance, in a
341
+ type or default argument in the *parameter-declaration-clause* or
342
+ used in the function body.
343
+
344
+ [^4]: This refers to unqualified names following the class name; such a
345
+ name may be used in a *base-specifier* or in the
346
+ *member-specification* of the class definition.
347
+
348
+ [^5]: This lookup applies whether the definition of `X` is nested within
349
+ `Y`’s definition or whether `X`’s definition appears in a namespace
350
+ scope enclosing `Y`’s definition [[class.nest]].
351
+
352
+ [^6]: That is, an unqualified name that occurs, for instance, in a type
353
+ in the *parameter-declaration-clause* or in the
354
+ *noexcept-specifier*.
355
+
356
+ [^7]: This lookup applies whether the member function is defined within
357
+ the definition of class `X` or whether the member function is
358
+ defined in a namespace scope enclosing `X`’s definition.
359
+
360
+ [^8]: Lookups in which function names are ignored include names
361
+ appearing in a *nested-name-specifier*, an
362
+ *elaborated-type-specifier*, or a *base-specifier*.
363
+
364
+ [^9]: The number of bits in a byte is reported by the macro `CHAR_BIT`
365
+ in the header `<climits>`.
366
+
367
+ [^10]: Under the “as-if” rule an implementation is allowed to store two
368
+ objects at the same machine address or not store an object at all if
369
+ the program cannot observe the difference [[intro.execution]].
370
+
371
+ [^11]: For example, before the construction of a global object that is
372
+ initialized via a user-provided constructor [[class.cdtor]].
373
+
374
+ [^12]: That is, an object for which a destructor will be called
375
+ implicitly—upon exit from the block for an object with automatic
376
+ storage duration, upon exit from the thread for an object with
377
+ thread storage duration, or upon exit from the program for an object
378
+ with static storage duration.
379
+
380
+ [^13]: Some implementations might define that copying an invalid pointer
381
+ value causes a system-generated runtime fault.
382
+
383
+ [^14]: The intent is to have `operator new()` implementable by calling
384
+ `std::malloc()` or `std::calloc()`, so the rules are substantially
385
+ the same. C++ differs from C in requiring a zero request to return a
386
+ non-null pointer.
387
+
388
+ [^15]: The global `operator delete(void*, std::size_t)` precludes use of
389
+ an allocation function `void operator new(std::size_t, std::size_t)`
390
+ as a placement allocation function ([[diff.cpp11.basic]]).
391
+
392
+ [^16]: This subclause does not impose restrictions on indirection
393
+ through pointers to memory not allocated by `::operator new`. This
394
+ maintains the ability of many C++ implementations to use binary
395
+ libraries and components written in other languages. In particular,
396
+ this applies to C binaries, because indirection through pointers to
397
+ memory allocated by `std::malloc` is not restricted.
398
+
399
+ [^17]: The same rules apply to initialization of an `initializer_list`
400
+ object [[dcl.init.list]] with its underlying temporary array.
401
+
402
+ [^18]: By using, for example, the library functions [[headers]]
403
+ `std::memcpy` or `std::memmove`.
404
+
405
+ [^19]: By using, for example, the library functions [[headers]]
406
+ `std::memcpy` or `std::memmove`.
407
+
408
+ [^20]: The intent is that the memory model of C++ is compatible with
409
+ that of ISO/IEC 9899 Programming Language C.
410
+
411
+ [^21]: The size and layout of an instance of an incompletely-defined
412
+ object type is unknown.
413
+
414
+ [^22]: This is also known as two’s complement representation.
415
+
416
+ [^23]: Static class members are objects or functions, and pointers to
417
+ them are ordinary pointers to objects or functions.
418
+
419
+ [^24]: For an object that is not within its lifetime, this is the first
420
+ byte in memory that it will occupy or used to occupy.
421
+
422
+ [^25]: The same representation and alignment requirements are meant to
423
+ imply interchangeability as arguments to functions, return values
424
+ from functions, and non-static data members of unions.
425
+
426
+ [^26]: As specified in  [[class.temporary]], after a full-expression is
427
+ evaluated, a sequence of zero or more invocations of destructor
428
+ functions for temporary objects takes place, usually in reverse
429
+ order of the construction of each temporary object.
430
+
431
+ [^27]: In other words, function executions do not interleave with each
432
+ other.
433
+
434
+ [^28]: An object with automatic or thread storage duration [[basic.stc]]
435
+ is associated with one specific thread, and can be accessed by a
436
+ different thread only indirectly through a pointer or reference
437
+ [[basic.compound]].
438
+
439
+ [^29]: A non-local variable with static storage duration having
440
+ initialization with side effects is initialized in this case, even
441
+ if it is not itself odr-used ([[basic.def.odr]],
442
+ [[basic.stc.static]]).