名称查找和声明点概念

时间:2015-01-27 04:41:35

标签: c++ namespaces

我对point of declarationname-lookup概念之间的正式联系感兴趣。特别是,当nested-name-specifier表示名称空间时,非限定名称查找会生成一组声明,如下所示:N4296::3.4.3.2 [namespace.qual]

  

对于名称空间X和名称m,名称空间限定的查找集   S(X,m)的定义如下:让S0(X,m)成为所有的集合   mX的声明和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; }

DEMO

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; }

DEMO

我提供的规则与声明概念无关,但实际上我们可以看到它的确如此。因此,标准隐含地假定名称的m声明点应该在使用名称的点之前。我认为应该明确指出。也许我丢失了指定的条款......如果是这样,你不能指出我那个吗?

1 个答案:

答案 0 :(得分:2)

从[basic.scope.namespace](§3.3.6/ 1),强调我的:

  

命名空间   成员名称具有名称空间范围它的潜在范围包括名称的点的命名空间   声明(3.3.2)以后

a只能在声明之后在namespace A 中找到。因此,示例(1)无效,因为尚未声明a,并且示例(2)有效,因为它已经存在。