数组初始化在C++中使用 const 变量
Array initialization use const variable in C++
-
这可以工作:
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++的性质而尝试运行您的程序时,操作系统将想知道堆栈区域的确切空间。在第一个示例中,操作系统将知道变量的值不会改变。但是对于操作系统视图的第二个示例,您的第一个变量"a"可以在
int a = 2;
这个和这个
const int size = a;
变量 A 可以更改。这就是为什么你的编译器不允许你编译你的代码。
为了了解有关内存管理基础知识的更多信息。我建议你https://stackoverflow.com/a/24922/2326288 此评论。
因为在第一种情况下,size
由编译器在编译时初始化。在第二种情况下,a
可以在运行时初始化,因此size
也将在运行时初始化,并且不再是编译时常量。
相关文章:
- 在内存不足之前,我可以声明多少个 const 变量?
- 当设置为 const 变量时使用 nullptr
- 声明与 const 变量和成员函数相同的标识符
- const变量是否可以在具有默认值的参数中赋值(作为可选参数)
- 编译器在传递 const 变量时返回错误:模板参数不是常量表达式
- 在成员函数之间传递const变量为数组的索引
- 为什么静态常量字符 * const 变量在为左值时可绑定到右值引用参数
- C 编译器可以执行用于返回值的命名const变量的RVO
- 如何访问一系列const变量作为const数组
- C 错误C3892:您无法分配const变量
- 是否可以在C++中推迟 const 变量的初始化,例如 Java 的"blank final"功能?
- 为什么将FMTFLAG指定两次 - 作为枚举的一部分,而另一个实例为静态const变量
- 使用非const变量代替所需的const变量(C )
- 使用const变量时,非静态数据成员的使用无效
- 定义,初始化全局const变量是安全的吗?
- const vs non-const变量一旦分配就没有变化
- 为什么设置const变量(将以相同的值存储)会导致不同的结果
- CPP中的私有静态常规成员变量与const变量
- 在避免新分配的同时,const变量的复杂初始化
- 如何通过其地址更改const变量的值