【问题标题】:Name lookup rules for nested-name-specifier嵌套名称说明符的名称查找规则
【发布时间】:2014-06-02 12:02:37
【问题描述】:

我已阅读以下内容 (3.4.3/1):

如果嵌套名称说明符中的 :: 范围解析运算符不是 前面有一个 decltype 说明符,查找该名称之前的名称 :: 仅考虑其特化的名称空间、类型和模板 是类型。

nested-name-specifier 的查找规则是什么?

例如:

#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 是否会在命名空间内被视为限定名称? IE。我们可以归纳地定义 nested-name-specifier 查找的规则。但我在标准中找不到类似的东西。是真的吗?

【问题讨论】:

标签: c++ language-lawyer qualified-name


【解决方案1】:

是的,它是归纳的,我想说它只是从措辞中得出的。首先,让我们根据::的关联性添加全括号:

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

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

所以j 由名称A::B 限定。是限定名,所以按照3.4.3查找。

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

【讨论】:

  • 要明确,(A::B)::j 不是有效代码;括号只是代表解析的工作方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
相关资源
最近更新 更多