C++ 在函数中使用const int size参数创建数组会在Visual Studio C++;:表达式的计算结果不是常数

C++ 在函数中使用const int size参数创建数组会在Visual Studio C++;:表达式的计算结果不是常数,c++,visual-c++,constants,C++,Visual C++,Constants,上述代码在Visual Studio C++中引发编译器错误: void foo(const int size) { char array[size]; } int main() { } 为什么size即使声明为const int也不作为常量计算? 但以下代码编译成功: error C2131: expression did not evaluate to a constant note: failure was caused by a read of a variable outsi

上述代码在Visual Studio C++中引发编译器错误:

void foo(const int size) {
    char array[size];
}
int main() { }
为什么
size
即使声明为
const int
也不作为常量计算?
但以下代码编译成功:

error C2131: expression did not evaluate to a constant
note: failure was caused by a read of a variable outside its lifetime

由于常量变量大小已初始化为“10”,因此无法修改大小的值。数组的大小是固定的,不能更改


int size=10;//大小的值可以更改。

数组的大小需要是编译时常量,而不仅仅是运行时的
常量。

这是因为大小确实是恒定的

int main() {
    const int size{ 10 };
    char array[size];
}
但是,这不会编译,因为大小是一个常量变量,而不是编译时常量(有细微的区别)

void foo(const int size){
字符数组[大小];
}
它不起作用的原因是,我可以用不同的参数调用foo

foo(10);
傅(42),;
傅(1),;
最简单的解决方法是使用std::vector,这就是您正在尝试的

void foo(const int size){
std::向量数组(大小);
}

现在“array”将以与原始代码相同的意图工作

C++是一种静态类型语言,
char-array[1]
char-array[2]
是不同的类型,因此在编译时必须知道这些类型

例如

在这种情况下,编译器无法在编译时知道
char array[size]
的类型,因为大小是在运行时确定的,所以这是一个错误


所以正如@Frodyne在评论中所说的,静态数组的大小必须是

如果你想给google一个术语,那么数组的大小必须是。
const int size
只是意味着
size
不能在
foo
中修改,但是你可以将任何你想要的值传递给它。例如
intx;标准:cin>>x;foo(x)
将完全合法。问题是“为什么大小即使声明为const int也不作为常量计算?”这如何回答这个问题?
int main() {
    const int size{ 10 };
    char array[size];
}
void foo(const int size) {
    char array[size];
}
int main() {
    int x = std::rand() % 1000;
    foo( x ); // Error
}