在以下示例中,数组v
的大小是否保证为2或3?
static const int i = 3;
class X {
char v[i];
static const int i = 2;
};
从标准,
3.3.6 / 2在S类中使用的名称N应在其上下文中引用相同的声明,并在S的完整范围内重新评估
我认为这意味着'我'将是2
,重新评估的东西在这里意味着什么?
答案 0 :(得分:4)
正确的行为是它应该导致错误,因为重新评估会改变含义:
第3.3.6节中的示例:
扩展到或超过类定义结尾的声明的潜在范围也扩展到由其成员定义定义的区域,即使成员是在类之外的词法上定义的(这包括静态数据成员定义,嵌套类定义,成员函数定义(包括成员函数体,对于构造函数(12.1),ctor-initializer(12.6.2))以及此类定义的声明器部分的任何部分,其后面是标识符,包括参数 - declaration-clause和任何默认参数(8.3.6)。[示例:
该示例与您的示例类似(使用enum
而不是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 };
};
在遇到v[i]
时,编译器只知道enum { i = 1 };
(或static const int i = 3;
,但是当知道完整的类声明时,char v[i]
会有所不同,因为i
将重新评估为2
。
答案 1 :(得分:1)
在这种情况下,数组大小应为3。如果你逐行查看代码。当构造数组时,Compliler对X :: i一无所知。如果在数组大小变为2时更改类内的行,则第二个我将首先隐藏。