2

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

在成员的类或命名空间的范围内查找限定 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;

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

4

3 回答 3

2

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

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

您自己引用了相关部分:

在成员的类或命名空间范围内查找限定 ID 后面的名称

因此,由于在此代码片段中

int A::C::b=a;

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

于 2014-06-04T13:00:05.533 回答
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之前的类型不是“由 [the] member definition 定义的区域”的一部分。

于 2014-06-04T13:03:03.950 回答
0

引用说“成员的范围”,而不是“成员的范围”;所以a在 的类范围内查找C。无论是否在b.

于 2014-06-04T12:59:54.650 回答