C ++是否支持可变长度数组?

不,等等,跟我一起…

VLA总是一个GCC扩展,但是它们被C99采用:

[C99: 6.7.5.2/4]:如果大小不存在,则数组types是不完整的types。 如果size的大小是*,而不是一个expression式,则数组types是一个非指定大小的可变长度的数组types,它只能在具有函数原型作用域的声明中使用; 这样的数组仍然是完整的types。 如果大小是一个整数常量expression式,并且元素types具有已知的常量大小,则数组types不是可变长度数组types; 否则,数组types是一个可变长度的数组types。

C99也被称为ISO/IEC 9899:1999

现在:

[C++11: 1.1/2]: C ++是一种基于ISO / IEC 9899:1999(以下简称C标准)规定的C编程语言的通用编程语言。 除了C提供的function之外,C ++还提供额外的数据types,类,模板,exception,命名空间,运算符重载,函数名称重载,引用,免费商店pipe理操作员以及其他库设施。

那么C ++ 11也不应该有VLA吗?

这种宽松的措辞并不意味着C99中的任何和所有东西都在C ++ 11中。 你所引用的只是介绍性文字。

这个C99特性 C ++自己的语义所覆盖 ,就像任何其他的“inheritance”特性一样:

[C++11: 8.3.4/1] :在D有forms的声明TD

D1 [ 常量expression式opt ] 属性 – 说明符 – select

[..]

这是我们在C ++中唯一的数组声明语法。

请注意,在“与C的兼容性”第C.1中没有提到这种差别。

常量expression式的定义对于两种语言是不同的。

 const size_t size = 5; int array[size]; // array in C++, VLA in C 

这为我编译:(g ++ 4.6与-std=c++0x )。 但是它不能用-pedantic编译(谢谢@MarkB)。 相反,它警告“ template.cpp:7:12:警告:ISO C ++禁止变长数组'n'[-Wvla]

 int main(int argc, char ** argv) { int n[argc]; } 

所以编译器在编译时不能知道n的大小。 这是C ++的GNU扩展吗? 这似乎是一个GNU扩展,并且VLA不是C ++ 11的官方部分。

(当然,我只是在玩一个编译器,所以拿一点盐来吧。)