------- Comment #28 from jason at gcc dot gnu dot org 2010-08-31 17:26 ------- (In reply to comment #18) > The optimization question in Comment #11 was answered incorrectly. > > The C++ standard in fact requires that Y be initialized before the constructor > is run; see [basic.start.init].
I disagree. In C++03, [basic.start.init] says Objects of POD types (3.9) with static storage duration initialized with constant expressions (5.19) shall be initialized before any dynamic initialization takes place. 5.19 [expr.const] says An arithmetic constant expression shall satisfy the requirements for an integral constant expression, except that floating literals need not be cast to integral or enumeration type, and conversions to floating point types are permitted. Note that this does not allow an arithmetic constant expression to involve const variables of floating point type, so "X + 2.0" is not an arithmetic constant expression, so Y is not required to have static initialization. But it is allowed to, as explained in comment #14. I think this distinction is not observable in C++03. But with C++0x constexpr it is; declaring Y as constexpr would be ill-formed unless X is also declared constexpr. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21089