在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计


void foo(const int size) {
char array[size];
}
int main() { }

上面的代码在Visual Studio C++中抛出编译器错误:

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

为什么即使size声明为const int,它也没有被评估为常量?
但以下代码编译成功:

int main() {
const int size{ 10 };
char array[size];
}

这之所以编译,是因为大小确实是恒定的。

int main() {
const int size{ 10 };
char array[size];
}

但是,这不会编译,因为大小是一个常量变量,而不是编译时常量(有一个细微的区别(

void foo(const int size) {
char array[size];
}

它不起作用的原因是因为我可以用不同的参数调用 foo。

foo(10);
foo(42);
foo(1);

最简单的解决方法是使用 std::vector,这就是您正在尝试做的......

void foo(const int size) {
std::vector<char> array(size);
}

现在,"数组"将以与原始代码相同的意图工作。

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

例如

void foo(const int size) {
char array[size];
}
int main() {
int x = std::rand() % 1000;
foo( x ); // Error
}

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

因此,@Frodyne注释中所述,静态数组的大小必须是常量表达式

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

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

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

最新更新