这可以工作:
const int size = 2;
int array[size] = {0};
Run Code Online (Sandbox Code Playgroud)这有编译错误:
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确实相同.
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)
因此,您可以申请一个具有动态大小的数组。
| 归档时间: |
|
| 查看次数: |
15704 次 |
| 最近记录: |