【问题标题】:The name lookup followed after qualified declarator-id在限定的 declarator-id 之后进行名称查找
【发布时间】:2014-06-04 12:52:16
【问题描述】:

我试图理解以下引用的含义 (3.4.3/3 N3797):

qualified-id 后面的名称在 成员的类或命名空间。

namespace A
{
    class C
    {
    public:
        static const int a=7;
        static int b;
    };
}

int A::C::b=a; //7

static int b; 的范围b 声明点之后的声明区域组成。其实:

在类中声明的名称的潜在范围不仅包括 名称声明点之后的声明区域,但是 也包括所有函数体、默认参数、 异常规范和大括号或等式初始化器 该类中的非静态数据成员

这意味着static const int a=7; 不属于static int b; 的范围。因此在int A::C::b=a; 中找不到static const int a=7

这是标准中的错字还是我的误解?

【问题讨论】:

  • 名称b 的(潜在)范围与与C 关联的类范围不同。
  • 您好像误会了什么。这两句话解释了不同的事情。

标签: c++ static-members qualified-name


【解决方案1】:

这意味着 static const int a=7;不属于范围 静态int b;。因此静态 const int a=7 不能在 int A::C::b=a;.

没有。它确切地暗示了您可以在那里阅读的内容:在类中声明的名称的潜在范围包含非静态数据成员的函数体等。这与上面的引用并不冲突——静态数据成员的声明区域(和范围)仍然包含它本身声明的类的范围。

您自己引用了相关部分:

在qualified-id后面的名字在范围内查找 成员的类或命名空间

因此,由于在这段代码中-sn-p

int A::C::b=a;

a用在declarator-id后面,在类中查找发现。

【讨论】:

    【解决方案2】:

    引用说的是“成员的范围”,而不是“成员的范围”;所以aC 的类范围内查找。无论b之后是否声明,都可以在那里找到。

    【讨论】:

      【解决方案3】:

      您引用的规则(3.3.7p1 的第 1 项)适用于类中使用的名称:

      namespace A
      {
          class C
          {
          public:
              int b = a;
              static const int a=7;
          };
      }
      

      允许您列出的代码的规则是同一段落的第 5 项:

      5) 延伸到或超过类定义结尾的声明的潜在范围也延伸到由其成员定义定义的区域,即使成员是在类之外的词法定义 [...]

      3.3.7p1 的适用性项目 1 和 5 之间显然有一些重叠,但这并不重要,因为它们在重叠的地方具有相同的效果。

      3.4.3p3 与 3.3.7p1 的第 5 项相同,只是措辞不同;它阐明了出现在 qualified-id 之前的类型不是“[the] member definition 定义的区域”的一部分。

      【讨论】:

        猜你喜欢
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 2015-10-06
        • 1970-01-01
        • 2015-01-28
        • 1970-01-01
        • 2015-04-11
        • 1970-01-01
        相关资源
        最近更新 更多