代码compiles and runs,但是合法吗? AFAIK,静态数组的大小必须在编译时知道。
#include <iostream>
void foo(const unsigned size){
double arr[size];
for(auto& i:arr){
i=2;
std::cout << i;
}
}
int main(){
unsigned size;
std::cin >> size;
foo(size);
}
答案 0 :(得分:3)
严格来说,这不合法。 标准C ++不支持可变长度数组(VLA) 。大多数编译器都支持VLA和扩展,但使用这些扩展可能会给你带来非便携行为。
此外,源代码中没有static
数组。为此,您需要在声明中使用static
关键字。
答案 1 :(得分:1)
正如用户657267所述,已经在N3639中讨论了C ++ 14的运行时大小数组,并讨论了另一个类似的功能std::dynarray,但它们已被C ++ 14拒绝。
目前,这不被视为标准的一部分,尽管有些编译器将其实现为非可移植扩展,例如gcc就是其中一个编译器(可能因为这在C99中是合法的)。
大多数情况下,你可以使用矢量来达到同样的效果。
答案 2 :(得分:0)
在您的示例中,没有具有静态存储持续时间的数组。函数中有一个具有自动存储持续时间的本地数组。 数组的大小应该是一个常量表达式。
如果你展示的代码是编译的,那么这意味着它是C ++中支持可变长度数组的编译器的一个特性,与C中的相同。