在下面的示例中,数组的大小是否v保证为2或3?
static const int i = 3;
class X {
char v[i];
static const int i = 2;
};
Run Code Online (Sandbox Code Playgroud)
从标准来看,
3.3.6/2在S类中使用的名称N应在其上下文中引用相同的声明,并在S的完整范围内重新评估
我认为这意味着'我'将会是2什么,重新评估的东西在这里意味着什么?
正确的行为是它应该导致错误,因为重新评估会改变含义:
3.3.6 节中的示例:
延伸到或超过类定义末尾的声明的潜在范围也延伸到由其成员定义定义的区域,即使成员是在类外部按词法定义的(这包括静态数据成员定义、嵌套类定义、成员函数定义(包括成员函数体,以及对于构造函数 (12.1) 而言,构造函数初始化器 (12.6.2))以及此类定义中紧随标识符的声明符部分的任何部分,包括参数声明子句以及任何默认参数 (8.3.6)。[示例:
该示例与您的示例类似(使用enum而不是 a static const int):
typedef int c;
enum { i = 1 };
class X {
char v[i]; // error: i refers to ::i
// but when reevaluated is X::i
int f() { return sizeof(c); } // OK X::c
char c;
enum { i = 2 };
};
Run Code Online (Sandbox Code Playgroud)
在遇到这种情况时v[i],编译器只知道enum { i = 1 };( 或static const int i = 3;,但是当知道完整的类声明时,char v[i]会有所不同,因为i会被重新评估为2.