我希望using namespace std;
能够在不污染全局命名空间的情况下应用于类和函数,但我想知道它是否可行。
namespace
{
using namespace std;
class S
{
public:
S()
{
cout << "ok";
}
friend ostream operator<<(ostream& os, const S& s);
};
}
对此有何警告?
答案 0 :(得分:1)
它会起作用但请记住以下几点:
您应该限制它在源文件中的使用,而不是在头文件中(一般you should refrain from using unnamed namespaces in headers),因为它们很容易弄乱你的符号定义,特别是如果有内联函数使用来自匿名命名空间)。
这是一个不好的做法,只是因为懒惰而添加额外的命名层次结构层(即匿名命名空间)就像听起来一样糟糕。
答案 1 :(得分:0)
如果它在头文件中,那么它不是优选的,因为该文件可以包含在多个源文件中。如果在某个源文件中,那么它是可接受的
答案 2 :(得分:0)
不要仅仅因为您可以限制using
指令的范围而决定使用匿名命名空间。
话虽如此,如果一个匿名(或任何其他)命名空间已经存在并且您希望其中包含using
的优点,只要您的编码标准没问题就可以了。
答案 3 :(得分:0)
虽然这看起来像是一个很好的解决方案,但在我的实验中并没有像我预期的那样做。它不限制using指令的范围。
考虑一下:
#include <string>
namespace {
string s1; // compile error
}
namespace {
string s2; // compile error
}
string s3; // compile error
int main()
{
}
这些字符串都没有编译,因为它们没有经过适当的限定。这就是我们的期望。
然后考虑一下:
#include <string>
namespace {
using namespace std;
string s1; // compiles fine (as expected)
}
namespace {
string t2; // compiles fine (I didn't expect that)
}
string v3; // compiles fine (I didn't expect that either)
int main()
{
}
因此,在未命名的命名空间中放置using指令似乎与将其放在全局命名空间中完全相同。
编辑:实际上,将符号放在未命名的命名空间中会使其成为翻译单元的本地符号。所以这就是它无法达到预期目的的原因。
因此,标题必须是禁止。