C++ 规范中突出显示的句子是什么意思§;3.3.7/1第5项?
§3.3.7/1第5项: 扩展到或超过结尾的声明的潜在范围 类定义的范围也扩展到其定义的区域 成员定义,即使成员是在外部按词汇定义的 类(包括静态数据成员定义、嵌套类) 定义和成员函数定义,包括成员 函数体和声明器的任何部分 声明器id后面的定义,包括 参数声明子句和任何默认参数(8.3.6)) 能否在本段第一个例子中确定这种声明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
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
,这就是我一次在两个问题之间切换得到的结果,这涉及到你上面引用的段落中提到的案例。