"using namespace"匿名命名空间内的语句

"using namespace" statement inside an anonymous namespace

本文关键字:语句 命名空间 using namespace      更新时间:2023-10-16

在匿名命名空间中使用using namespace语句时,是否将中使用的命名空间带入文件范围?例如:

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

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

对于非限定查找指定本身包含using指令的第二个命名空间,其效果就像来自第二个名称空间的using指令也出现在第一个命名空间中一样。

根据7.3.1.1[namespace.namename]第1段,有一种针对未命名命名空间的隐式使用指令:

未命名的名称空间定义的行为就像被取代一样

内联命名空间唯一{/*空正文*/}
使用命名空间唯一
命名空间唯一{命名空间主体}

其中inline出现当且仅当它出现在未命名的命名空间定义中时,翻译单元中所有出现的unique都被相同的标识符替换,并且该标识符不同于整个程序中的所有其他标识符。

因此,答案是"是的,这应该是编译的"(我尝试过的所有C++编译器都是这样)。

是。

这是因为匿名命名空间会自动进入包含范围。

是的,因为正如Dietmar Kühl所引用的,匿名命名空间被其内容所取代。

但是,您应该注意,它被替换为声明(编辑)的位置,所以这里面没有"魔法"。例如,这不起作用:

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