这可以工作:
const int size = 2;
int array[size] = {0};
这有编译错误:
int a = 2;
const int size = a;
int array[size] = {0};
为什么?
因为 C++ 委员会的人这么决定。
技术原因是用于初始化
size
的第一个表达式是常量表达式,可以在编译期间计算。这意味着编译器还可以知道数组将有多大,并且可以在编译时完成分配(在这种情况下“保留”可能是更合适的术语)。
在第二种情况下,表达式不是常量表达式(给定 C++ 定义),并且这种反转是不可能的。
在第二种情况下,该值确实是在
size
初始化时固定的,这一事实是完全无关的。规则基于“表达式类型”,第二个表达式使用可变变量,因此编译器认为它是非常量。
允许第二种形式进行编译时初始化需要进行流程分析,因为编译器需要区分
int a = 2;
const int size = a;
和
int a = foo();
const int size = a;
其中涉及
size
的表达式确实是相同的。
const int size = 2;
int array[size] = {0};
这里,
2
是一个字面值,这意味着你无法更改它,并且编译器在编译时就知道该值。
int a = 2;
const int size = a;
int array[size] = {0};
但是,
a
是一个变量,这意味着a
的值可以改变,并且在运行时是确定的,所以编译器会禁止你。
你可以用
int a = 2;
int size = a;
int* array = new int[size];
这样就可以申请动态大小的数组了。
即将进行内存管理。
当操作系统由于 C++ 的性质而尝试运行您的程序时,操作系统会想要知道 stack 区域的确切空间。在第一个示例中,操作系统将知道变量的值不会改变。但对于操作系统视图的第二个示例,您的第一个变量“a”可以在
之间更改int a = 2;
这个和这个
const int size = a;
你的变量 a 是可以改变的。这就是为什么你的编译器不允许你编译你的代码。
为了了解更多内存管理基础知识。我推荐你 https://stackoverflow.com/a/24922/2326288此评论。
因为在第一种情况下,
size
是在编译时由编译器初始化的。在第二种情况下 a
may 在 run-time 初始化,因此 size
也将在运行时初始化并且不再是编译时常量。