在限定的declarator-id之后进行名称查找

时间:2014-06-04 12:52:16

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

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

  

在qualified-id范围内查找qual-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;的范围。因此,static const int a=7中找不到int A::C::b=a;

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

3 个答案:

答案 0 :(得分:2)

  

这意味着静态const int a = 7;不属于范围   of static int b;。因此,无法找到静态const int a = 7   int A :: C :: b = a;。

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

您自己引用了相关部分:

  

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

因此,因为在此代码片段中

int A::C::b=a;

a在declarator-id之后使用,它在类中查找并找到。

答案 1 :(得分:0)

报价说"会员班级"的范围,而不是"会员的范围&#34 ;;所以在a的班级范围中查找C。无论是否在b之后声明它都可以找到它。

答案 2 :(得分:0)

您引用的规则(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 之前出现的类型不属于[成员定义"定义的" 区域。