It seems to me that using unanchored namespaces is just asking for trouble later when someone puts in a new namespace that happens to have the same name as a root level namespace and mysteriously alters the meaning of a whole lot of programs. So, why do people always say std::
instead of ::std::
. Do they really mean to be saying "I want to use whatever std
is handy, not the root one."?
Here is an example of what I mean:
In fred/Foo.h:
#include <string>
namespace fred {
class Foo {
public:
void aPublicMember(const std::string &s);
};
} // end namespace fred
In fred/Bar.h:
namespace fred {
namespace std { // A standard fred component
class string { // Something rather unlike the ::std::string
// ...
};
} // namespace std
class Bar {
public:
void aPublicMember(std::string &s);
};
} // namespace fred
In oops.cpp:
#include <string>
#include "fred/Bar.h"
#include "fred/Foo.h" // Oops, the meaning of Foo is now different.
Is that what people want, or am I missing something?
And maybe you say that you should just never name a namespace std
. And that's all well and good, but what about some other root level namespace then? Should any root level namespace anybody ever defines anywhere always be off-limits for a sub-namespace name?
To clarify, I won't consider any answer that tells me std
is special because I just used it as an example. I'm talking about a general issue, and I'm using std
as a prop to illustrate it, though I do admit it's a rather startling prop.
<memory>
of VS2022, and they actually DO use a macro_STD
in there which expands to::std::
and then refer to things like so:_STD addressof
– Gateshead