【发布时间】:2016-06-08 21:47:45
【问题描述】:
为什么从constexpr 初始化array 的维度如此重要?下面代码中的常规variable 是否暗示(如果允许合法)将来可能是array 的resizing?
int a=5;
int arr[a];
a=10;
【问题讨论】:
-
C99 添加了对此的支持,称为可变长度数组,或 VLA。它们不太适合 C++ 类型系统。特别是,
sizeof始终是 C++ 中的编译时间。 -
你认为
arr的类型是什么?请注意,在编译时必须知道类型,并且还要注意数组的大小是其类型的一部分。 -
数组大小是类型的一部分。所以看到
int[a]的每个人都必须看到相同的类型。想象一下你有using T = int[a];。如果a可以改变,那意味着什么? -
C++ 已经有一个标准化的可移植变长数组,它被称为
std::vector。vector和 VLA 之间的唯一区别是vector在堆上分配其数组,而 VLA 在堆栈上分配其数组(在堆栈上分配可变长度数据是危险的,这就是为什么 @ 987654335@ 从未标准化)。 VLA 是针对那些想要支持它的供应商特定的编译器扩展。 -
@M.Pak 否。在一般情况下,编译器无法知道非常量变量的值。所以它不会试图在这样的特定情况下弄清楚。您需要一个常量(字面量)、const 或 constexpr。
标签: c++ arrays initialization malloc