
"Arkadiy Vertleyb" <vertleyb@hotmail.com> writes:
"David Abrahams" <dave@boost-consulting.com> wrote
Any time a template is instantitated, all names in its definition must map to the same entities in each translation unit, or you violate the ODR. By definition, names in the unnamed namespace refer to distinct entities in each translation unit.
Does this mean that it's not allowed to use anonimous namespace-level names inside templates?
Unless those, too, are in the unnamed namespace, I think that's technically correct. You can probably get away with it, though.
I assume there also should be problems with non-template classes, too, if anonimous namespace-defined names are used inside the body of such a class...
Yes, definitely.
OTOH, you said "all names in its definition". Does this also mean "all names used to produce this definition"?
I think so.
Because if we use "typeof" inside such template, it would still resolve to the same type in different translation units (after all the metaprogramming used to produce this type is done).
I understand that. I think you can get away with it, but that it's not legal. This is another reason I think Boost.Bind's placeholders have to leave the unnamed namespace.
IOW, such templates in different translation units will be absolutely the same, although in each translation unit the compiler will have to instantiate different intermediate classes in order to produce them.
Right.
Do you still think this should be a problem?
"_Should_ be?" no, I never did. I just think it's technically a violation of the rules. -- Dave Abrahams Boost Consulting http://www.boost-consulting.com