根据我的意见,以下代码不应编译。然而,它确实可以完美地打印:
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;
}
我很困惑,因为我知道数组的大小是一个必须在编译时评估的 constexp。另外,我不涉及任何类型的动态分配(即我不使用 malloc()、new 等)。函数的局部变量都是在堆栈上创建的。无论如何,没有堆参与!
那么,为什么它会编译?
最佳答案
Why does C++ allow passing the array size at run-time to a function in order to construct a fixed-size array?
C++ 语言不允许允许您使用函数参数作为数组变量的长度。数组的长度必须是编译时常量表达式。
示例中 myArray
的长度不是编译时常量表达式,因此程序格式错误。
So, why is it compiling?
因为你的编译器选择这样做。 C++ 语言仅仅允许编译器无法编译格式错误的程序。它们可以成功编译,这让编译器可以扩展语言。您正在使用语言扩展。
C++ 标准确实要求编译器诊断格式错误的程序(除非特定规则允许不这样做),如果它没有为您发出诊断消息,则编译器不符合标准。
以下是符合标准的编译器的输出示例:
warning: ISO C++ forbids variable length array 'myArray' [-Wvla]
关于c++ - 为什么 C++ 允许在运行时将数组大小传递给函数以构造固定大小的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58150580/