数组初始化在C++中使用const变量

Ell*_*llo 6 c++ arrays const

  1. 这可以工作:

    const int size = 2;
    int array[size] = {0}; 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这有编译错误:

    int a = 2;
    const int size = a;
    int array[size] = {0};
    
    Run Code Online (Sandbox Code Playgroud)

为什么?

650*_*502 10

因为C++委员会的成员决定如此.

技术原因是用于初始化的第一个表达式size是一个常量表达式,它可以在编译期间计算.这意味着编译器也可以知道数组的大小,并且可以在编译时完成分配(在这种情况下"预留"可能是更合适的术语).

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

事实上,在第二种情况下,该值确实是由时间size初始化的,这是完全无关紧要的.规则基于"表达式",第二个表达式使用可变变量,因此编译器认为它是非常量的.

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

int a = 2;
const int size = a;
Run Code Online (Sandbox Code Playgroud)

int a = foo();
const int size = a;
Run Code Online (Sandbox Code Playgroud)

涉及的表达size确实相同.


Yal*_*ung 6

const int size = 2;
int array[size] = {0}; 
Run Code Online (Sandbox Code Playgroud)

这里2是一个文字值,这意味着您无法更改它,并且编译器在编译时就知道该值。

int a = 2;
const int size = a;
int array[size] = {0};
Run Code Online (Sandbox Code Playgroud)

但是,a是一个变量,这意味着a可以更改该值,并且可以在运行时确定该值,因此编译器禁止您使用。您可以使用

int a = 2;
int size = a;
int* array = new int[size];
Run Code Online (Sandbox Code Playgroud)

因此,您可以申请一个具有动态大小的数组。