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

时间:2015-03-11 20:58:15

标签: c++ language-lawyer

此代码来自§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 个答案:

答案 0 :(得分:3)

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

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

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

2)让类成员中的i的值与声明的类成员数组的实际长度完全不同,理论上是相同的长度。