Early dynamic initialization permitted for local statics?

T

Triple-DES

I've seen this question raised more than once, but I have not yet seen
a definite, conclusive answer. Consider the following code:

struct C {
C() {} // might throw
};

int main() {
try {
static C c;
}
catch(...) {
//...
}
}

Now according to 6.7/4:
"(...) An implementation is permitted to perform early initialization
of other local objects with static storage duration under the same
conditions that an implementation is permitted to statically
initialize an object with static storage duration in namespace scope
(3.6.2).(...)"

Are the following statements correct?
1)
An implementation may perform early initialization of c, possibly
resulting in an uncaught exception.

2)
Early initialization can be prevented by making C::C() modify an
arbitrary object of namespace scope with static storage duration, per
3.6.2/2

Thanks in advance.
DP
 
B

Bo Persson

Triple-DES said:
I've seen this question raised more than once, but I have not yet
seen a definite, conclusive answer. Consider the following code:

struct C {
C() {} // might throw
};

int main() {
try {
static C c;
}
catch(...) {
//...
}
}

Now according to 6.7/4:
"(...) An implementation is permitted to perform early
initialization of other local objects with static storage duration
under the same conditions that an implementation is permitted to
statically initialize an object with static storage duration in
namespace scope (3.6.2).(...)"

This talks about statically initializing with a constant expression.
As your example involves a constructor, this is more likely a dynamic
initlialization.

The static keyword doesn't help. :)
Are the following statements correct?
1)
An implementation may perform early initialization of c, possibly
resulting in an uncaught exception.

I don't think so.
2)
Early initialization can be prevented by making C::C() modify an
arbitrary object of namespace scope with static storage duration,
per
3.6.2/2

No.


The other question is why you need a static variable inside main()?!
As main can only be called once, there is little risk of initializing
the local variable more than once.



Bo Persson
 
T

Triple-DES

This talks about statically initializing with a constant expression.
As your example involves a constructor, this is more likely a dynamic
initlialization.

Sure, I have considered that interpretation. But see for instance this
thread:
http://groups.google.com/group/comp...e_frm/thread/c9e3870d8b58a39/7b9a16407c86419a

Notably, the comment by Francis W. Glassborow:
(...)And I would much prefer that it was not allowed to do dynamic
initialisation early, not least because of implications on exception
safety.(...)
The static keyword doesn't help.  :) [snip]
The other question is why you need a static variable inside main()?!
As main can only be called once, there is little risk of initializing
the local variable more than once.

That's just to illustrate the problem.

DP
 
I

Irin Kotchencko

Interestingly, if:

void f() {
static C aC;
/* ... */
}

If the ctor throws an exception, when f called the second time, C ctor
is called again. At least in my implementation.

Is this behavior specified in the standard and can I rely on it ?
 
T

Triple-DES

Interestingly, if:

void f() {
    static C aC;
    /* ... */

}

If the ctor throws an exception, when f called the second time, C ctor
is called again. At least in my implementation.

Is this behavior specified in the standard and can I rely on it ?

Yes, this is also specified in 6.7/4:
"(...)If the initialization exits by throwing an exception, the
initialization is not complete, so it will be tried again next time
control enters the declaration(...)"

DP
 
I

Irin Kotchencko

Yes, this is also specified in 6.7/4:
"(...)If the initialization exits by throwing an exception, the
initialization is not complete, so it will be tried again next time
control enters the declaration(...)"

DP
thank you
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top