C++ 规范中突出显示的句子是什么意思§;3.3.7/1第5项?

C++ 规范中突出显示的句子是什么意思§;3.3.7/1第5项?,c++,language-lawyer,c++14,C++,Language Lawyer,C++14,§3.3.7/1第5项: 扩展到或超过结尾的声明的潜在范围 类定义的范围也扩展到其定义的区域 成员定义,即使成员是在外部按词汇定义的 类(包括静态数据成员定义、嵌套类) 定义和成员函数定义,包括成员 函数体和声明器的任何部分 声明器id后面的定义,包括 参数声明子句和任何默认参数(8.3.6)) 能否在本段第一个例子中确定这种声明 typedef int c; enum { i = 1 }; class X { char v[i]; int f() { return sizeof

§3.3.7/1第5项:

扩展到或超过结尾的声明的潜在范围 类定义的范围也扩展到其定义的区域 成员定义,即使成员是在外部按词汇定义的 类(包括静态数据成员定义、嵌套类) 定义和成员函数定义,包括成员 函数体和声明器的任何部分 声明器id后面的定义,包括 参数声明子句和任何默认参数(8.3.6))

能否在本段第一个例子中确定这种声明

typedef int c;
enum { i = 1 };
class X {
    char v[i];
    int f() { return sizeof(c); }
    char c;
    enum { i = 2 };
};

对。类
X
的成员
c
的声明在
f
的定义中是可见的,即使从词汇上讲,它出现在后面。这意味着
sizeof
表达式应用于成员,而不是外部的类型,这意味着它将返回1,而不是
int
的大小(可能是4)

此外,根据这条规则,当声明数组
v
时,枚举常量
X::i
应该是可见的,尽管这让我感到惊讶,我强烈建议避免这样的代码-听起来像是编译器错误或开发人员的误解正在等待发生


编辑:轨道中的闪电可能是正确的,关于声明器部分的注释只适用于越界定义。

除了上面的答案之外,它似乎在说,给定该类定义之外的所有代码,即使
X::f
是在类之外定义的,如下所示:

typedef int c;
enum { i = 1 };
class X {
    char v[i];
    int f();
    char c;
    enum { i = 2 };
};

int X::f() {
    return sizeof(c);
}

在定义
X::f
的上下文中,
c
将引用成员变量
X::c
,而不是上面的
typedef
,因为尽管它看起来像是被全局定义的,
f
实际上存在于
X
的范围内。

这很好。我能清楚地理解你说的话。但是,与可能不存在此扩展的任何其他成员相比,是什么使得成员
c
扩展到类定义的末尾?这就是我试图从那句话中理解的东西;它一直延伸到最后,就像其他成员一样。我刚刚指出了这一点,因为对于这个成员来说,它很重要,而对于
v
f
本身来说,它并不重要,因为在您的小示例中,它们实际上没有被引用。基本上,规则只是说“你可以访问成员函数体中的类成员和类似的东西,不管它们在哪里”。我不同意枚举。
v
的声明不是参数列表,而是函数定义etc@LightnessRacesinOrbit数组大小是declarator-id后面的declarator的一部分。但我不确定整个内容是否是一个定义,而不仅仅是一个声明。它表示“以及declarator的任何部分都是此类定义的一部分”。这不是我在之前的评论中所说的“此类定义”我相信你的意思是
X::f
而不是
X::foo
,这就是我一次在两个问题之间切换得到的结果,这涉及到你上面引用的段落中提到的案例。