此代码来自§3.3.7/ 1.5中的示例:
enum { i = 1 };
class X {
char v[i]; // error: i refers to ::i
// but when reevaluated is X::i
enum { i = 2 };
};
由于§3.3.7/ 1.2 ,GCC会发出错误
但是,如果我们应用§3.4.1/ 7,则声明i
中的名称char v[i];
的查找将在全局范围内找到enum{ i = 1 };
。重新声明enum{ i = 2 };
有什么问题?
答案 0 :(得分:3)
问题是在成员函数作用域(和其他类作用域)中,枚举的类版本会影响全局值。
如果不是错误,编译器必须选择两种令人惊讶的行为之一:
1)始终使用类枚举值,这意味着它必须完全解析类以确定有效大小是否可用。
2)让类成员中的i
的值与声明的类成员数组的实际长度完全不同,理论上是相同的长度。