
David Abrahams wrote:
on Thu Jun 14 2007, Eric Niebler <eric-AT-boost-consulting.com> wrote:
The result of ensuing discussion was that a reference is a pointer, and so they *do* have identity.
That's a different question than I thought you were referring to. I would put the reference itself in an unnamed namespace, and I'm pretty sure that handles it. As long as the reference refers to something not in an unnamed namespace:
template<typename T> struct static_const { static T const value; };
template<typename T> T const static_const<T>::value = {};
struct placeholder {};
namespace // <<============== HERE { placeholder const &_1 = static_const<placeholder>::value; }
template<class T> void foo(T const &) { // use _1 here. OK, _1 refers to the same object // in all translation units. It doesn't matter that the // reference is has a different identity; the object is // the same: static_const<placeholder>::value }
Does that really change anything? Imagine replacing the reference with a const pointer, and the potential for an ODR violation becomes more obvious: template<typename T> struct static_const { static T const value; }; template<typename T> T const static_const<T>::value = {}; struct placeholder {}; namespace { placeholder const *const _1 = &static_const<placeholder>::value; } template<class T> void foo(T const &) { // use *_1 here. Even though *_1 refers to the same // object, we're indirecting through a different pointer // in different TUs. ODR violation? } Since you're indirecting through a different pointer, the code generated for foo() would be different in different translation units. Isn't that a violation of the ODR? -- Eric Niebler Boost Consulting www.boost-consulting.com The Astoria Seminar ==> http://www.astoriaseminar.com