在匿名命名空间内使用"using namespace"语句

20

在匿名命名空间中使用 using namespace 语句,会将所使用的命名空间引入到文件作用域中吗?例如:

namespace foo
{
    int f() { return 1; }
}
namespace
{
    using namespace foo;
}
int a()
{
    return f(); // Will this compile?
}

6
你试过编译它吗? - David Brown
尝试编译这个代码可能比在StackOverflow上提问更省力!干得好! - johnsyweb
19
当然,需要注意的是这是一个C++问题。代码能够在特定编译器中编译并不意味着它符合标准。 - Cody Gray
6
对于我们这些发现这个问题的人来说,这比编译要容易。 - Shep
3个回答

17
根据7.3.4 [namespace.udir]第4段,命名空间指令是可传递的:

对于未限定的查找(nominate)会提名第二个包含using指令(using-directives)的命名空间,其效果就好像第二个命名空间中的using指令也出现在第一个命名空间中一样。

而根据7.3.1.1 [namespace.unnamed]第1段,未命名的命名空间有一种隐式using指令:

一个未命名的命名空间定义的行为就好像被以下内容替换:

inline namespace unique { /* 空内容 */ }
using namespace unique ;
namespace unique { namespace-body }

其中inline关键字只有在未命名的命名空间定义中出现时才出现,翻译单元中所有unique的出现都被替换为相同的标识符,并且该标识符与整个程序中的所有其他标识符都不同。

因此,答案是“是的,这应该编译通过”(我用所有的C++编译器都能编译通过)。

3

是的。

这是因为匿名命名空间会自动引入到包含它的作用域中。


1

是的,因为正如Dietmar Kühl所引用的那样,匿名命名空间会被其内容替换。

但是,你应该注意它被替换的位置恰好是声明的地方(编辑),所以这并没有什么“魔法”。例如,以下代码是行不通的:

namespace foo
{
    int f() { return 1; }
}

int a()
{
    return f(); // Will this compile?
}

namespace
{
    using namespace foo;
}

匿名命名空间是一个合适的命名空间。它的初始声明被替换为引用的文本,包括using namespace指令,但其主体不会被替换为任何内容。 - Potatoswatter
我对“匿名命名空间被其内容替换”这一说法持有异议。命名空间的声明和定义是完全相同的事情。内容不参与任何替换。 - Potatoswatter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接