为什么有时只允许使用 const int 作为数组大小?

问题描述 投票:0回答:4
  1. 这可以工作:

    const int size = 2;
    int array[size] = {0}; 
    
  2. 这有编译错误:

    int a = 2;
    const int size = a;
    int array[size] = {0};
    

为什么?

c++ arrays constants constant-expression
4个回答
16
投票

因为 C++ 委员会的人这么决定。

技术原因是用于初始化

size
的第一个表达式是常量表达式,可以在编译期间计算。这意味着编译器还可以知道数组将有多大,并且可以在编译时完成分配(在这种情况下“保留”可能是更合适的术语)。

在第二种情况下,表达式不是常量表达式(给定 C++ 定义),并且这种反转是不可能的。

在第二种情况下,该值确实是在

size
初始化时固定的,这一事实是完全无关的。规则基于“表达式类型”,第二个表达式使用可变变量,因此编译器认为它是非常量。

允许第二种形式进行编译时初始化需要进行流程分析,因为编译器需要区分

int a = 2;
const int size = a;

int a = foo();
const int size = a;

其中涉及

size 
的表达式确实是相同的。


8
投票
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];

这样就可以申请动态大小的数组了。


4
投票

即将进行内存管理。

当操作系统由于 C++ 的性质而尝试运行您的程序时,操作系统会想要知道 stack 区域的确切空间。在第一个示例中,操作系统将知道变量的值不会改变。但对于操作系统视图的第二个示例,您的第一个变量“a”可以在

之间更改
int a = 2;

这个和这个

const int size = a;

你的变量 a 是可以改变的。这就是为什么你的编译器不允许你编译你的代码。

为了了解更多内存管理基础知识。我推荐你 https://stackoverflow.com/a/24922/2326288此评论。


0
投票

因为在第一种情况下,

size
是在编译时由编译器初始化的。在第二种情况下
a
mayrun-time 初始化,因此
size
也将在运行时初始化并且不再是编译时常量。

© www.soinside.com 2019 - 2024. All rights reserved.