在匿名命名空间中使用 using namespace
语句,会将所使用的命名空间引入到文件作用域中吗?例如:
namespace foo
{
int f() { return 1; }
}
namespace
{
using namespace foo;
}
int a()
{
return f(); // Will this compile?
}
在匿名命名空间中使用 using namespace
语句,会将所使用的命名空间引入到文件作用域中吗?例如:
namespace foo
{
int f() { return 1; }
}
namespace
{
using namespace foo;
}
int a()
{
return f(); // Will this compile?
}
而根据7.3.1.1 [namespace.unnamed]第1段,未命名的命名空间有一种隐式using指令:对于未限定的查找(nominate)会提名第二个包含using指令(using-directives)的命名空间,其效果就好像第二个命名空间中的using指令也出现在第一个命名空间中一样。
因此,答案是“是的,这应该编译通过”(我用所有的C++编译器都能编译通过)。一个未命名的命名空间定义的行为就好像被以下内容替换:
inline namespace unique { /* 空内容 */ }
using namespace unique ;
namespace unique { namespace-body }其中inline关键字只有在未命名的命名空间定义中出现时才出现,翻译单元中所有unique的出现都被替换为相同的标识符,并且该标识符与整个程序中的所有其他标识符都不同。
是的。
这是因为匿名命名空间会自动引入到包含它的作用域中。
是的,因为正如Dietmar Kühl所引用的那样,匿名命名空间会被其内容替换。
但是,你应该注意它被替换的位置恰好是声明的地方(编辑),所以这并没有什么“魔法”。例如,以下代码是行不通的:
namespace foo
{
int f() { return 1; }
}
int a()
{
return f(); // Will this compile?
}
namespace
{
using namespace foo;
}
using namespace
指令,但其主体不会被替换为任何内容。 - Potatoswatter