作者:king1994 | 来源:互联网 | 2022-12-07 10:17
我写了下面这段代码
#include
const int N = 5;
class X
{
public:
int array[N];
void foo()
{
std::cout <<"array size:"<
上述代码不能与GCC一起编译:
从我在编译时的观点来看,数组被定义为一个包含五个整数的数组,N被定义为5.如何编译器解析变量的名称声明?
1> StoryTeller ..:
在成员函数的范围内(甚至是那些定义为内联的函数),该类被认为是完整的1.因此,使用N
必须使用成员枚举器.它的价值必须是3.
但是,在声明类成员数据时并非如此.此时(指定时array
),不会将该类视为完整.所以N
只能参考之前看到的内容,这意味着它必须是全局常量.
Clang接受它,但是发出6
(sizeof(int) * 5 / 3
).GCC(8)没有,但它并不是真正无效的代码.这只是容易出错.更好地定义的方法是在定义数组之前将枚举器移动到
enum { N = 3 };
int array[N];
...或者如果我们不这样做,那么我们可以使用范围分辨率来指代"正确的N"
sizeof(array) / ::N
重新排列类定义会更好,因为它不会仍然容易出错(我们可能忘记使用合格的::N
).
1:来自最新的C++标准草案
[class.mem]/6
一个完整的类的上下文是一个
函数体([dcl.fct.def.general]),
默认参数([dcl.fct.default]),
noexcept说明符,
合同条件([dcl.attr.contract]),或
默认成员初始化程序
在类的成员规范内.