为什么数组需要使用const类型的尺寸?
C++数组初始化:const尺寸与普通变量尺寸的差异解析
先来看这段能直观体现差异的代码:
const size_t size = 5; int array[size]{1,2,3,4,5}; // 可以初始化,因为size是const类型 size_t another_size = 5; int another_array[another_size]; // 无法执行int another_array[another_size]{1,2,3,4,5}; another_array[0] = 1; another_array[1] = 9090; another_array[2] = 76; another_array[3] = 90; another_array[4] = 100;
核心区别其实和C++对编译期常量的要求直接相关:
- 用
const size_t size = 5定义的尺寸,是编译阶段就能确定值的常量表达式。编译器在编译时就明确知道数组大小是5,所以完全支持用初始化列表{1,2,3,4,5}直接填充数组,这符合标准数组的初始化规则。 - 而
size_t another_size = 5是普通变量,哪怕初始值是5,它的实际值属于运行期确定的范畴(理论上可以被修改)。用这种变量定义的数组属于变长数组(VLA)——这是C99的特性,C++标准并未正式纳入,仅部分编译器(比如GCC)作为扩展支持。而VLA不允许用初始化列表直接初始化,因为编译器没法在编译阶段确定数组的实际大小,也就无法提前处理初始化列表的内容,只能在定义后逐个元素赋值。
说白了就是:编译器能不能在编译时敲定数组大小,直接决定了它是否支持列表式的直接初始化。
内容的提问来源于stack exchange,提问作者Art
相关产品推荐
相关产品推荐

