嵌套名称说明符的名称查找规则

Name lookup rules for nested-name-specifier

本文关键字:规则 查找 说明符 嵌套      更新时间:2023-10-16

我读了以下(3.4.3/1):

如果嵌套名称说明符中的::范围解析操作符不是查找前面的名称::只考虑其专门化的名称空间、类型和模板类型。

嵌套名称说明符的查找规则是什么?

例如:

#include <iostrem>
namespace A
{
    int j=5;
}
int main()
{
    std::cout << A::j //I assume that A will be searched as just *unqualified-name* appeared inside the function which is a member of namespace
}

第二个例子:

namespace A
{
    namespace B
    {
        int j=5;
    }
}
int main()
{
    std::cout << A::B::j
}

在第二个例子中,A::B将在命名空间中被视为限定名,这是真的吗?也就是说,我们可以为嵌套名称说明符查找定义规则。但是我在标准中找不到这样的内容。这是真的吗?

是的,这是归纳性的,我想说这只是从措辞中得出的结论。首先,让我们基于::的结合性添加完整括号:

(std::cout) << ((A::B)::j)

(以上只是为了演示解析器如何理解优先级,它不是有效代码)。

所以j被命名为A::B。它是一个限定名,所以它是根据3.4.3查找的。

A::B本身是一个限定名(它符合5.1.1/8概述的语法形式),因此根据限定名的规则查找。