在嵌套名称说明符中查找第一个命名空间名称?

时间:2013-07-02 22:49:12

标签: c++ c++11 language-lawyer

如果翻译单元中没有任何类,模板,枚举或typedef的嵌套名称说明符A::,如果格式正确,则标识符A必须引用命名空间。

例如:

namespace X
{
    int i;
}

int main()
{
    X::i = 42; // Here X:: is a nested-name-specifier
               // and X is a namespace-name
               // i is looked up qualified w.r.t. X
}

在上面的示例中AX,但我的问题是关于一般情况。

如何在A中的名称空间名A::进行名称查找?

名称查找规则在3.4中进行了总结,但我不清楚在这种情况下如何(或哪些)适用。

例如,查找A非限定名称查找? 3.4.1是否适用于它?

换句话说:在名为A的名称空间中搜索哪些名称空间,顺序是什么?你是如何从标准中得出结论的?

2 个答案:

答案 0 :(得分:4)

是的,A是每个3.4.1的常规非限定名称查找,连续搜索包含嵌套名称说明符的作用域,但只有类和名称空间名称被找到。例如,你可以这样:

int main()
{
    int X;
    X::i = 42; // OK, int X not found.
}

http://ideone.com/NaEIVd

实际上不建议使用这个漏洞;如果X是类类型的对象,则X::iX.i可能完全不同。


从标准中得出这个结论,从3.4.3开始(合格查找,这是我们最终分析的高级结构),在第1段中说明,

  

在应用于表示其类,名称空间或枚举的嵌套名称说明符的:: scope resolution运算符(5.1)之后,可以引用类或名称空间成员或枚举数的名称。 如果嵌套名称说明符中的:: scope resolution运算符前面没有decltype-specifier,则查找此前面的名称::仅考虑其专门化类型的名称空间,类型和模板。如果找到的名称未指定名称空间或类,枚举或依赖类型,则程序格式不正确。

阅读第2段,它不适用,因为未声明qualified-id。其余段落同样指明了不适用的例外情况。那么,::之前的事情是什么?请参阅语法。

nested-name-specifier:
    ::
    type-name ::
    namespace-name ::
    decltype-specifier ::
    nested-name-specifier identifier ::
    nested-name-specifier templateopt simple-template-id ::

只有type-name ::namespace-name ::符合我们的先验标准。这些也与我们迄今为止发现的内容重叠。如何在特定环境中解决type-namenamespace-name?不合格的查找。继续进行3.4.1。

首先,3.4.1 / 1是一个要记住的一般规则:

  

在3.4.1中列出的所有情况下,在每个相应类别中列出的顺序中搜索范围;一旦找到名称的声明,名称查找就会结束。如果没有找到声明,该程序就会形成错误。

下一个适用的段落是6:

  

在函数的declarator-id之后的函数定义中使用的名称是名称空间N的成员(其中,仅出于说明的目的,N可以表示全局作用域),应该在其使用之前声明。在其中使用它的块或其封闭块(6.3)中的块,或者应该在它在命名空间N中使用之前声明,或者,如果N是嵌套命名空间,则应该在它在N的封闭命名空间之一中使用之前声明。 / p>

此规则并未告诉我们实际在全局命名空间中搜索名称,但它确实在列表中提及了函数的封闭命名空间(在本例中为全局命名空间)和段落1表示搜索列出的命名空间。所以这足以构建名称查找。

令人惊讶的是,它没有提到递归搜索优先考虑内部的,封闭的命名空间,但实际上你没有在你的例子中有这样的东西所以我会停在这里:)。将编译保留到编译器要快得多,并且仅在出现问题时才能手动工作。

答案 1 :(得分:1)

在您给出的示例中,X将被视为非限定名称查找。因此它确实遵循3.4.1中的规则

在这种情况下,搜索的命名空间如下:

  1. 定义之前main()函数的本地名称空间。 (根据7.3.1.4,可能没有定义名称空间。)
  2. 全局命名空间。
  3. 我担心我无法指向标准中的某个位置,它明确指出命名空间名称与任何其他名称相同。但他们是。名称查找不知道它是名称空间名称(它可以是类名称或结构名称),直到它实际找到具有该名称的名称空间。