C++ 名称中的限定名称查找

C++ 名称中的限定名称查找,c++,namespaces,qualified-name,C++,Namespaces,Qualified Name,我想了解名称空间限定名称查找规则。我试图在示例中这样做: namespace A { int a=::b; //error: ‘::b’ has not been declared } int b=6; 我的推理中引用了一段话(3.4.3.2/2 N3797): 对于名称空间X和名称m,名称空间限定查找集S(X, m) 定义如下:设S(X,m)是所有声明的集 X中的m和内联名称空间集X(7.3.1)。如果S(X,m)是 不是空的,S(X,m)是S(X,m);否则,S(X,m)是 S(N

我想了解名称空间限定名称查找规则。我试图在示例中这样做:

namespace A
{
    int a=::b; //error: ‘::b’ has not been declared
}
int b=6;
我的推理中引用了一段话(3.4.3.2/2 N3797):

对于名称空间X和名称m,名称空间限定查找集S(X, m) 定义如下:设S(X,m)是所有声明的集 X中的m和内联名称空间集X(7.3.1)。如果S(X,m)是 不是空的,S(X,m)是S(X,m);否则,S(X,m)是 S(Ni,m)表示通过使用X和中的指令指定的所有名称空间Ni 它的内联命名空间集


X
成为一个全局范围。我们有
S(X,b)={intb=6}
。这意味着名称查找必须成功。但事实上,该计划的形式是错误的。可能我没有正确理解此规则吗?

b在全局范围内,但必须在使用它之前声明它。 像

(N 3690草稿)
3.4.1不合格名称查找

4.在全局范围内使用的名称,在任何函数、类或用户声明的命名空间之外,应在其在全局范围内使用之前声明。

该名称在标准中的位置?在
3.4.1
N 3690
中的
非限定名称查找下给出。它是非限定名称查找。捕获内容在您粗体的文本中。名称查找是成功的。但是,
b
尚未添加到“全局命名空间中的所有声明集”。@Lilshieste但我们可以在实际数据成员声明之前出现的成员函数定义中使用类数据成员。但这是一个范围问题;不是名称查找。(3.3.7/1是为类类型提供这种功能的工具。)@Lilshieste我不同意,因为非限定名称查找描述为它对应于成员的类范围。这些概念是相互关联的(不是正式的)。3.4.1/1提到“在范围中搜索声明…”。对于类范围,按照3.3.7/1,声明的顺序并不重要。对于全局范围,声明的顺序很重要。但在这两种情况下,声明必须在名称查找之前进行。
int b=6;
namespace A
{
    int a=::b; 
}