为什么从constexpr
初始化array
的维度如此重要?以下代码中的常规variable
是否意味着(如果合法的话)array
在未来可能的resizing
?
int a=5;
int arr[a];
a=10;
这样的特性在n3497中提出,但在C++14之前就被废弃了。C和C++是完全不同的语言。它们的语法可能相似,但它们的进化有很大的差异。C++的目标是更加类型安全,并附加危险或无用的特性(如auto_ptr
)。
C++"VLA"无论如何都不会很有用,举几个明确排除在提案之外的功能:
- 多维数组,其中除了顶级之外还有运行时绑定(类似地,array new也不支持)
- 对函数声明符语法的修改
- sizeof(a)是运行时求值的表达式,返回
- "typedef int a[n];"计算"n"并将其传递给typedef
还有更多的情况。C++的规范是C99的两倍大,还有一些,想象一下,由于人们试图在任何地方硬塞进VLA,"为什么这个Quirk有效"、"为什么不有效"或"这个Quirk合法吗?"的错误报告泛滥。
该论文甚至对VLA提出了一个常见的批评:
堆栈溢出的可能性更大,特别是在大小取决于在外部输入上,并且没有正确检查。某些环境可能因此禁止使用该特征。这种禁令可以使用静态分析工具轻松执行。
想象一下,如果这是一个功能,那么将编写大量粗心的垃圾代码。你可能会争辩说,在C++中,你可以开枪打自己的脚。但C++至少会调整你的视线,使冲击点在地板上,而不是你的脚。
你该怎么办?
使用std::vector
。有人抱怨一个简单程序的性能吗?您过早地进行了优化。