constexpr初始化数组



为什么从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。有人抱怨一个简单程序的性能吗?您过早地进行了优化。

最新更新