由constexpr初始化数组

时间:2016-06-08 21:47:46

标签: c++ arrays initialization malloc

为什么从array初始化constexpr的维度如此重要?代码中的常规variable是否会暗示(如果允许合法)将来可能resizing array

int a=5;
int arr[a];
a=10;

1 个答案:

答案 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。对简单程序的性能抱怨?你过早地进行了优化。