为什么从array
初始化constexpr
的维度如此重要?代码中的常规variable
是否会暗示(如果允许合法)将来可能resizing
array
?
int a=5;
int arr[a];
a=10;
答案 0 :(得分:1)
在n3497中提出了这样的功能,但在C ++ 14之前已经废弃了。 C和C ++是完全不同的语言。它们的语法可能类似,但它们的演变有很大差异。 C ++旨在提供更安全的类型和消除危险或无用的功能(如auto_ptr
)。
C ++“VLA”无论如何都不会非常有用,只列举一些明确排除在提案之外的功能:
- 多维数组,其中顶级以外的数据库具有运行时绑定(类似地,array-new也不支持)
- 对函数声明符语法的修改
- sizeof(a)是运行时评估的表达式,返回
的大小- “typedef int a [n];”评估“n”并通过typedef传递它
毫无疑问,还有更多的情况。 C ++的规格是C99的两倍,然后是一些,想象一下大量的bug报告“为什么这个Quirk工作”或“为什么这个Quirk没有工作”或“这个Quirk合法?”因为人们试图到处都是盗窃VLA。
这篇论文甚至引发了对VLA的共同批评:
堆栈溢出变得更有可能,特别是如果大小取决于 在外部输入上,未正确检查。有些环境可能会 因此禁止使用该功能。这样的禁令可以 使用静态分析工具轻松实施。
想象一下,如果这是一个功能,将会写出粗心的垃圾代码。你可能会争辩说,在C ++中,你可以用脚射击自己。但C ++试图至少调整你的视线,以便影响点是地板,而不是你的脚。
你应该做什么呢?
使用std::vector
。对简单程序的性能抱怨?你过早地进行了优化。