Global object initialization [was: Phoenix-2 prerelease]

Joel de Guzman <joel@boost-consulting.com> writes:
Comments, feedback very welcome!
Here are some sample preset definitions of arg1..argN actor<argument<0> > const arg1 = argument<0>(); actor<argument<1> > const arg2 = argument<1>(); actor<argument<2> > const arg3 = argument<2>(); and its BLL_1.._N style counterparts: You shouldn't use the BLL abbrev., especially not without introducing it first. I suggest "Boost.Lambda" actor<argument<0> > const _1 = argument<0>(); actor<argument<1> > const _2 = argument<1>(); actor<argument<2> > const _3 = argument<2>(); Have you considered the ODR/initialization order implications of this? Eric and I have been discussing this in another context, and it seems to us that you have a choice: 1. The placeholders are statically initialized const POD objects in an unnamed namespace and you have likely ODR violation when used by templates in multiple translation units. 2. The placeholders are dynamically initialized references in an unnamed namespace and you risk undefined behavior when they are used without initialization due to initialization order issues 3. The placeholders are dynamically initialized objects in an unnamed namespace, and you have likely ODR violation *and* initialization order issues Seems from the doc like you have #3, which is the worst of both worlds. No? -- Dave Abrahams Boost Consulting www.boost-consulting.com
participants (1)
-
David Abrahams