- Title
- Order of initialization in instantiation units
- Status
- cd1
- Section
- 5.2 [lex.phases]
- Submitter
- Mark Mitchell
Created on 2002-07-02.00:00:00 last changed 217 months ago
Messages
Date: 2004-03-15.00:00:00
[Voted into WP at March 2004 meeting.]
Date: 2004-03-15.00:00:00
[Voted into WP at March 2004 meeting.]
Date: 2002-10-15.00:00:00
Notes from October 2002 meeting: We discussed this and agreed that we really do mean the the order
is unspecified. John Spicer will propose wording on handling of
instantiation units in initialization. Proposed resolution (April 2003):
TC1 contains the following text in 6.10.3.2 [basic.start.static] paragraph 1:
This was revised by issue 270 to read:
This addresses this issue but while reviewing this issue some
additional changes were suggested for the above wording:
Objects with static storage duration defined in namespace scope in the
same translation unit and dynamically initialized shall be initialized
in the order in which their definition appears in the translation
unit.
Dynamic initialization of an object is either ordered or unordered.
Explicit specializations and definitions
of class template static data members have ordered
initialization. Other class template static data member instances have
unordered initialization. Other objects defined in namespace scope
have ordered initialization. Objects defined within a single
translation unit and with ordered initialization shall be initialized
in the order of their definitions in the translation unit. The order
of initialization is unspecified for objects with unordered
initialization and for objects defined in different translation units.
Dynamic initialization of an object is either ordered or unordered.
Definitions of explicitly specialized
Explicit specializations and definitions of
class template static data members have ordered
initialization. Other class template static data members (i.e.,
implicitly or explicitly instantiated specializations)
instances have
unordered initialization. Other objects defined in namespace scope
have ordered initialization. Objects defined within a single
translation unit and with ordered initialization shall be initialized
in the order of their definitions in the translation unit. The order
of initialization is unspecified for objects with unordered
initialization and for objects defined in different translation units.
Date: 2002-11-08.00:00:00
Should this program do what its author obviously expects? As far as
I can tell, the standard says that the point of instantiation for
Fib<n-1>::Value is the same as the point of instantiation as the
enclosing specialization, i.e., Fib<n>::Value. What in the standard
actually says that these things get initialized in the right order?
John Spicer:
My opinion is that the standard does not specify
the behavior of this program.
I thought there was a core issue related to this, but I could not find it.
The issue that I recall proposed tightening up the static initialization
rules to make more cases well defined. Your comment about point of instantiation is correct, but I don't think that
really matters. What matters is the order of execution of the initialization
code at execution time. Instantiations don't really live in
"translation units"
according to the standard. They live in "instantiation units", and the
handling of instantiation units in initialization is unspecified (which should
probably be another core issue). See 5.2 [lex.phases] paragraph 8.
template<int n>
struct Fib { static int Value; };
template <>
int Fib<0>::Value = 0;
template <>
int Fib<1>::Value = 1;
template<int n>
int Fib<n>::Value = Fib<n-1>::Value + Fib<n-2>::Value;
int f ()
{
return Fib<40>::Value;
}
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2008-10-05 00:00:00 | admin | set | status: wp -> cd1 |
| 2004-04-09 00:00:00 | admin | set | messages: + msg998 |
| 2004-04-09 00:00:00 | admin | set | status: ready -> wp |
| 2003-11-15 00:00:00 | admin | set | status: review -> ready |
| 2002-11-08 00:00:00 | admin | set | messages: + msg732 |
| 2002-11-08 00:00:00 | admin | set | messages: + msg731 |
| 2002-11-08 00:00:00 | admin | set | status: open -> review |
| 2002-07-02 00:00:00 | admin | create | |