§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 成员数组的长度相同。
此代码是从 §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 成员数组的长度相同。