【发布时间】:2014-06-04 17:27:30
【问题描述】:
我想了解命名空间限定名查找规则。我正在尝试在示例中这样做:
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 中的 using 指令指定的所有命名空间 Ni 和 它的内联命名空间集。
让X 成为一个全局范围。我们有S(X,b)={int b=6}。这意味着名称查找必须成功。但实际上,该程序是格式错误的。可能我没有正确理解这条规则吗?
【问题讨论】:
-
关键就在您加粗的文本中。名称查找是成功的。但是,
b尚未添加到“全局命名空间中所有声明的集合”中。 -
@Lilshieste 但是我们可以在实际数据成员声明之前出现的成员函数定义中使用类数据成员。
-
但这是范围问题;不是名称查找。 (而 3.3.7/1 为类类型提供了这种能力。)
-
@Lilshieste 我不同意,因为非限定名称查找被描述为对应于成员的类范围。这些概念是相互关联的(不是正式的)。
-
3.4.1/1 提到“在范围内搜索声明......”。对于类范围,声明的顺序无关紧要,根据 3.3.7/1。对于全局范围,声明的顺序确实很重要。但在这两种情况下,声明必须出现在名称查找之前。
标签: c++ namespaces qualified-name