该代码是从§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的值与声明的类成员数组的实际长度完全不同,从概念上讲,其长度应相同。

09-10 00:43
查看更多