在以下程序中,我们有两个名称空间:
#include <iostream>
namespace B
{
int c = 42;
}
namespace A
{
using namespace B;
int a = 442;
}
namespace B
{
int b = 24;
}
int main()
{
std::cout << A::a << std::endl; //442
std::cout << A::b << std::endl; //24
std::cout << A::c << std::endl; //42
}
我认为N4296::3.3.6/1 [basic.scope.namespace]
命名空间成员名称具有命名空间范围。它的潜在范围 从名称的声明点(3.3.2)包括其命名空间 向前;和为每个使用指令(7.3.4)提名 成员的名称空间,成员的潜在范围包括该部分 后面的using指令的潜在范围 成员的声明要点。
因此,在namespace A
的情况下,成员b
的潜在范围不应该包含程序的任何部分,因为成员后来被声明为{{1} }。但实际上它可以通过限定名称查找找到。怎么了?
答案 0 :(得分:2)
如果您再次阅读此片段:
成员的[
b
]潜在范围包括在成员的声明点之后的使用指令[inA
]的潜在范围部分。
我相信您必须将其视为b
从A
声明之后的b
范围内。在您打印A::b
的地方,实际上“遵循会员的声明点”,因此对于该行,b
可以在A
的范围内找到。这完全有效。