根据我的意见,以下代码不应编译。但是,它确实可以完美打印:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
实际上,即使我从参数中删除了“ const”也是如此。
void arrayTest(const int size) {
int myArray[size];
for(int i=0; i<size; i++) {
myArray[i] = i;
}
for(int i=0; i<size; i++) {
cout << myArray[i] << " ";
}
cout << endl;
}
int main() {
arrayTest(15);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为我知道数组的大小是一个constexp,必须在编译时进行评估。另外,我不涉及任何类型的动态分配(即,我不使用malloc(),new等)。函数的局部变量都在堆栈上创建。无需堆参与!
那么,为什么要编译呢?
为什么C ++允许在运行时将数组大小传递给函数以构造固定大小的数组?
C ++语言并没有允许您使用的功能参数作为数组变量的长度。数组的长度必须是编译时常数表达式。
myArray您的示例中的长度不是编译时常数表达式,因此程序格式错误。
那么,为什么要编译呢?
因为您的编译器选择这样做。C ++语言仅允许编译器使格式错误的程序无法编译。它们被允许成功编译,这使编译器可以扩展语言。您正在使用语言扩展。
C ++标准确实要求编译器诊断格式错误的程序(除非特定规则不允许这样做),并且,如果没有为您发布诊断消息,则编译器不符合该标准。
以下是符合标准的编译器的示例输出:
警告:ISO C ++禁止使用可变长度数组'myArray'[-Wvla]