§3.3.7/1.2 有什么理由被视为错误吗?

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

本文关键字:理由 错误 什么      更新时间:2023-10-16

此代码是从 §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 };有什么问题?

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

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

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

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