该代码是从§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 };
有什么问题? 最佳答案
问题在于,在成员函数作用域(和其他类作用域)中,枚举的类版本掩盖了全局值。
如果不是错误,则编译器必须选择两种令人惊讶的行为之一:
1)始终使用类枚举的值,这意味着它必须完全解析该类以确定有效大小是否可用。
2)类成员中的i
的值与声明的类成员数组的实际长度完全不同,从概念上讲,其长度应相同。