§3.3.7/1.2 是否有任何理由被视为错误?

Is there any reason for §3.3.7/1.2 to be considered an error?

此代码是从 §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 };
};

GCC 由于 §3.3.7/1.2

发出错误

但是,如果我们应用 §3.4.1/7,在声明 char v[i]; 中查找名称 i 将在全局范围内找到 enum{ i = 1 };。重新声明 enum{ i = 2 }; 有什么问题?

问题是在成员函数作用域(以及其他 class 作用域)中,枚举的 class 版本隐藏了全局值。

如果不是错误,编译器将不得不选择两种令人惊讶的行为之一:

1) 始终使用 class 枚举的值,这意味着它必须完全解析 class 以确定是否有可用的有效大小。

2) class 成员中 i 的值 实际 长度完全不同名义上声明的 class 成员数组的长度相同。