我对point of declaration
和name-lookup
概念之间的正式联系感兴趣。特别是,当nested-name-specifier
表示名称空间时,非限定名称查找会生成一组声明,如下所示:N4296::3.4.3.2 [namespace.qual]
对于名称空间
X
和名称m
,名称空间限定的查找集S(X,m)
的定义如下:让S0(X,m)
成为所有的集合m
中X
的声明和X
的内联命名空间集(7.3.1)。如果S0(X,m)
不为空,S(X,m)
为S0(X,m)
;否则,S(X,m)
就是S(Ni,m)
的联合,用于由using-directives指定的所有名称空间Ni
在X
及其内联命名空间集。
让我举几个例子:
1
#include <iostream>
namespace A
{
int b = 42;
}
int a = A::a; //Error
namespace A
{
int a = 24;
}
int main(){ std::cout << a << std::endl; }
2
#include <iostream>
namespace A
{
int b = 42;
}
namespace A
{
int a = 24;
}
int a = A::a; //OK
int main(){ std::cout << a << std::endl; }
我提供的规则与声明概念无关,但实际上我们可以看到它的确如此。因此,标准隐含地假定名称的m
声明点应该在使用名称的点之前。我认为应该明确指出。也许我丢失了指定的条款......如果是这样,你不能指出我那个吗?
答案 0 :(得分:2)
从[basic.scope.namespace](§3.3.6/ 1),强调我的:
命名空间 成员名称具有名称空间范围它的潜在范围包括名称的点的命名空间 声明(3.3.2)以后
a
只能在声明之后在namespace A
中找到。因此,示例(1)无效,因为尚未声明a
,并且示例(2)有效,因为它已经存在。