名称查找和声明点概念

Name lookup and point of declaration concepts

本文关键字:声明 查找      更新时间:2023-10-16

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

对于命名空间X和名称m,命名空间限定的查找集 S(X,m)定义如下:让S0(X,m)成为所有人的集合 X 中的m声明和内联命名空间集 X (7.3.1)。如果 S0(X,m)不是空的,S(X,m)S0(X,m);否则,S(X,m)是 由 using 指令指定的所有命名空间Ni S(Ni,m)联合 及其内联命名空间集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; }

演示

阿拉伯数字。

#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声明点应位于使用该名称的点之前。我认为应该明确指定。也许我丢失了指定它的条款......如果是这样,你就不能指出我那个吗?

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

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

a只有在声明才能在namespace A中找到。因此,示例 (1) 无效,因为尚未声明a而示例 (2) 有效,因为它已声明。