我对point of declaration和name-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)是由X中的-指令及其内联命名空间集指定的所有命名空间Ni的S(Ni,m)的联合。
让我举几个例子:
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声明点应该位于使用名称的点之前。我认为应该明文规定。也许我失去了规定的条款..。如果是的话,你就不能指给我看那个吗?
发布于 2015-01-27 04:56:15
来自basic.scope.namespace,重点是我的:
名称空间成员名具有命名空间范围。它的潜在作用域包括名称的声明点(3.3.2)开始的的名称空间
只有在声明a后才能在namespace A中找到它。所以示例(1)是无效的,因为a还没有被声明,而例(2)是有效的,因为它是。
https://stackoverflow.com/questions/28163389
复制相似问题