C++ 14中的可变长度数组?

Jon*_*Mee 7 c++ arrays c99 variable-length-array visual-studio-2015

n3639提出将 s采用到C++ 14中(至少在第一维中是这样).

最新的我已经能够找到 n3639列表:

C++ 14的第一张CD中的功能,随后被删除到技术规范

这有没有成为技术规范,还是丢失了?

我的问题的原因是,我注意到这段代码:

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

这无法在Visual Studio 2015和gcc中构建(当使用"-pedantic"标志时).

做工精细下gcc5.1,但仍然未能建立的Visual Studio 2015年之下.

这只是gcc在C++ 14中错误地支持c99的可变长度数组,还是以某种方式使它成为C++ 14并且Visual Studio 2015无法将其提取出来?

编辑:看起来gcc已经删除了gcc6.2中的支持:http://coliru.stacked-crooked.com/a/303ae1970fa3f5d2

Jon*_*Mee 16

首先,n3639希望使用Runtime Bound(ARB)而不是可变长度数组(VLA)来实现阵列.ARB将支持排除的一部分VLA:

  • 多维数组,其中顶级以外的数据库具有运行时绑定(类似地,array-new也不支持)
  • 对函数声明符语法的修改
  • sizeof(a) 是运行时评估的表达式,返回大小 a
  • typedef int a[n];n通过评估和传递typedef

2014年2月,在华盛顿州Issaquah,标准委员会一致投票决定n3820组建阵列扩展技术规范,它的初始修订源于n3639和Dynarrays 的提议.

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

标准委员会2014年10月24日的电话会议引用了对语言设施,实施可能性以及对阵列扩展技术规范的期望的巨大分歧,最终将其描述为处于不稳定状态.

标准委员会2015年5月在堪萨斯州Lenexa举行的会议接着给出了方向性指导,即阵列扩展技术规范不会以其当前形式被接受,并建议:

剥离其当前内容的TS,并等待可行的提案出现[1]

最终,标准委员会2016年3月在佛罗里达州杰克逊维尔召开的会议上,确认了一些阵列相关提案的目标是图书馆基础技术规范,因此关闭了阵列扩展技术规范.这是一致投票,其中8 赞成,5票赞成,6票弃权.

顺便提一下,进入库基础技术规范的唯一与阵列相关的工作是允许运行时创建array通道make_array.C++的创造者Bjarne Stroustrup 在这个主题上滔滔不绝:

我们需要具有运行时指定边界的数组,并且"昨天"更安全地访问此类存储

遗憾的是,对于Stroustrup博士,我们以及整个C++社区,没有未来计划用简单的c99 VLA形式用C++复活ARB/VLA.