从ISO / IEC 14882:2003 8.3.4 / 1:
因此,以下内容不应编译:
#pragma once
class IAmAClass
{
public:
IAmAClass();
~IAmAClass();
private:
int somearray[0]; // Zero sized array
};
但是确实如此。但是,以下内容:
#pragma once
class IAmAClass
{
public:
IAmAClass();
~IAmAClass();
private:
int somearray[0];
int var = 23; // Added this expression
};
无法编译,并出现以下错误(与预期的一样)(Visual C++)
error C2229: class 'IAmAClass' has an illegal zero-sized array
当代码在函数中时,根据标准,它将永远不会编译。
因此,为什么代码在头文件中以这种方式表现,编译通过或失败的差异似乎取决于语句是否执行零大小数组声明。
最佳答案
如果存在,则“如果存在常量表达式(5.19)”中的关键字为。不是,所以第一个版本可以编译。
但是,仅当这些变体数组是struct
或class
中的最后一个元素时,才允许(和保持理智),在这种情况下,预计它们将根据情况使用分配给该结构的额外空间。
如果在其他元素之前允许使用未知长度的数组,那么其他代码将如何知道在内存中的哪些位置查找这些元素?
关于c++ - 头文件中的C++零长度数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24706911/