gpt4 book ai didi

c++ - 使用命名空间会导致名称隐藏吗?

转载 作者:IT老高 更新时间:2023-10-28 23:20:40 28 4
gpt4 key购买 nike

考虑以下代码:

namespace C {
class X {};
}

namespace A {
class X {};

namespace B {
using namespace C;

X x;
}
}

由于 using namespace 指令,我期望 x 的类型为 C::X,但同时 VS2010 和在线 LLVM/Clang 编译器将命名空间 B 内的 X 解析为 A::X。使用 using 声明(using C::X)更改 using 指令,然后它会按预期解析为 C::X

标准说明使用指令 [7.3.4.2]:

A using-directive specifies that the names in the nominated namespace can be used in the scope in which the using-directive appears after the using-directive. During unqualified name lookup (3.4.1), the names appear as if they were declared in the nearest enclosing namespace which contains both the using-directive and the nominated namespace.

我的理解是 C::X 应该看起来好像在命名空间 B 中声明,有效地隐藏了 A::X。使用指令和使用声明之间的这种不一致背后是标准的哪些部分?有没有办法通过 using 指令从外部范围隐藏名称?

最佳答案

关于使用指令的章节似乎以某种方式清楚地表明您正在看到预期的行为:

7.3.4p2 A using-directive specifies that the names in the nominated namespace can be used in the scope in which the using-directive appears after the using-directive. During unqualified name lookup (3.4.1), the names appear as if they were declared in the nearest enclosing namespace which contains both the using-directive and the nominated namespace.

7.3.4p3 A using-directive does not add any members to the declarative region in which it appears.

using-directive将命名空间的成员添加到指令的公共(public)命名空间祖先和使用的命名空间的查找集中,而不是直接添加到所在的范围使用指令。这在第二个引用中明确说明:它不会将任何成员添加到 using-directive 的声明区域。

稍后有一个示例旨在说明其他内容,但实际上显示了这一点:

7.3.4p4 [...] For another example

namespace A {
int i;
}
namespace B {
int i;
int j;
namespace C {
namespace D {
using namespace A;
int j;
int k;
int a = i; // B::i hides A::i
}

最后一个示例用于阐明传递性(并且包含更多代码),但实际上它等同于您删除额外代码后的代码。

因此,在您的情况下,using-directive 似乎没有隐藏,而是被隐藏了。

关于c++ - 使用命名空间会导致名称隐藏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10741428/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com