2016-11-16 94 views
5

n3639提议通过 S的成C++ 14C++ 14中的可变长度数组?

latest I've been able to find列表n3639如(至少对于所述第一尺寸。):在C的第一CD

特点++ 14,随后删除到一个技术规范

这是否曾经使它成为一个技术规范,或者它是否失去了手?

原因我的问题是,我发现这段代码:(使用“-pedantic”标志时)

void f(size_t n) { 
    int a[n]; 
    for (size_t i = 0; i < n; ++i) 
     a[i] = 2 * i; 
    sort(a, a + n); 
} 

这种失败在Visual Studio 2015年在海湾合作委员会建立

Works fine下gcc5.1,但仍 fails to build的Visual Studio 2015下

这只是gcc的错误在C++ 14支持C99的变长数组或没有这在某种程度上使之成为C++ 14和Visual Studio 2015年失败d来捡起来?

编辑:它看起来像GCC有去除gcc6.2支持: http://coliru.stacked-crooked.com/a/303ae1970fa3f5d2

+2

自C++ 03或更早版本以来,它一直是GCC扩展。 –

+1

GCC支持这个扩展。打开警告标志。或者更好的是,不要在C++中使用VLA。 – DeiDei

+1

[已从标准中删除](https://gcc.gnu.org/projects/cxx-status.html) –

回答

9

首先,n3639一直在寻找到位阵列,运行时绑定(ARB)没有变长数组(VLA )。 ARBs的将支持VLAS的一个子集,其不包括:

  • 多维数组,其中除顶层已经运行时约束(类似于,阵列新不支持任一)
  • 修改函数声明语法
  • sizeof(a)是一个运行时间计算的表达式返回的a
  • typedef int a[n];评估n以及使通过所述typedef
  • 0的大小

在伊萨夸,华盛顿2014年2月,在标准委员会unanimously votedn3820形成阵列扩展技术规范,这是最初的版本来源于n3639和the proposal of Dynarrays

2014年5月,n4043n4050分别试图解决阵列扩展技术规范的Dynarray和ARB部分中的一些“半编辑问题”。

the standard committee's October 24 2014 teleconference引用了语言设施,实现可能性以及Array Extensions技术规范对数据扩展技术规范的渴望方面的巨大分歧,最终将其描述为处于僵局状态。

The standard committee's May 2015 meeting in Lenexa, Kansas继续给该阵列扩展技术规格将不会接受它的当前形式,并建议方向性指引:

剥离其当前内容的TS,并等待一个可行的建议沿着[1]

最终the standard committee's March 2016 meeting in Jacksonville, Florida移动关闭阵列扩展技术规范在确认一些阵列相关的建议是目标来而不是图书馆基础技术规范。有一个unanimous vote to do so与8强烈赞成,5赞成,6弃权。

顺便说一下,进入库基础技术规范的唯一与阵列相关的工作是通过make_array允许运行时创建arrayBjarne Stroustrup,C++的创造者,waxed eloquent on the topic

我们需要运行时间限定的边界和这样的存储安全访问阵列“昨天”

可悲的是,对于斯特劳斯博士,美国和作为一个整体的C++社区,没有未来计划用C++简单的c99 VLA表单重新生成ARB/VLA。