类中成员的范围
Scope of members in class
在下面的例子中,数组v
的大小保证是2还是3?
static const int i = 3;
class X {
char v[i];
static const int i = 2;
};
从标准,
3.3.6/2在类S中使用的名称N应在其上下文中以及在S的完整范围内重新评估时引用相同的声明
我认为这意味着' I '应该是2
,这里的重新评估是什么意思?
正确的行为应该是导致错误,因为重新求值会改变含义:
来自3.3.6节的例子:
扩展到类定义末尾或之后的声明的潜在作用域也扩展到其成员定义所定义的区域,即使成员是在类的外部词法定义的(包括静态数据成员定义、嵌套类定义、成员函数定义(包括成员函数体),对于构造函数(12.1),(ctor-initializer(12.6.2))和此类定义中紧跟标识符的声明符部分的任何部分,包括形参声明子句和任何默认实参(8.3.6)。(例子:
该示例与您的示例类似(使用enum
而不是static const int
):
typedef int c;
enum { i = 1 };
class X {
char v[i]; // error: i refers to ::i
// but when reevaluated is X::i
int f() { return sizeof(c); } // OK X::c
char c;
enum { i = 2 };
};
在遇到v[i]
时,编译器只知道enum { i = 1 };
(或static const int i = 3;
),但当知道完整的类声明时,char v[i]
将不同,因为i
将被重新求值为2
。
在这种情况下数组的大小应该是3。如果你逐行查看你的代码。编译器在构造数组时对X::i一无所知。
相关文章:
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 迭代嵌套映射与范围为循环:没有名为"first"的成员
- 检查私有成员变量是否在一定范围内,如果没有调整
- 立即传递其成员时的右值范围
- 成员变量在超出BeginPlay函数虚幻引擎的范围时丢失值c++
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- 对象超出范围后,引用成员设置为 0
- pImpl、范围和隐藏数据成员
- 在命名成员函数重载解析期间,"this"何时不在范围内?
- 当在另一个范围中,将SelfAdjointeigensolver保存为成员的结果被重新引入
- 成员的结构与命名空间的潜在范围
- C++奇怪的问题.数据成员超出范围
- 范围视图作为数据成员
- 基于循环的C ISTRINGSTREAM范围没有开始成员
- 为 具有"end"成员变量的类型启用基于范围的
- 如何将成员函数引入范围
- 如何基于每个成员覆盖类范围的__declspec(dllexport)注释?
- 如何在标题文件中获取成员功能的正确代码覆盖范围
- 访问成员C 时,结构的向量生成了范围的错误
- 错误:非静态数据成员的使用无效,在此范围内未声明变量