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

Lig*_*ica 33 c++ variable-length-array c++11

不,等等,忍受我...

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

[C99: 6.7.5.2/4]:如果大小不存在,则数组类型是不完整类型.如果大小是*而不是表达式,则数组类型是未指定大小的可变长度数组类型,只能在具有函数原型范围的声明中使用; 尽管如此,这些数组仍然是完整类型.如果size是一个整型常量表达式,并且元素类型具有已知的常量大小, 则数组类型不是可变长度数组类型; 否则,数组类型是可变长度数组类型.

C99也称为ISO/IEC 9899:1999.

现在:

[C++11: 1.1/2]: C++是基于ISO/IEC 9899:1999(以下称为C标准)中规定的C编程语言的通用编程语言.除了C提供的功能之外,C++还提供其他数据类型,类,模板,异常,命名空间,运算符重载,函数名称重载,引用,免费存储管理操作符和其他库设施.

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

Joh*_*itb 16

这种余地措辞并不意味着C99中的任何内容都在C++ 11中.你引用的只是介绍性文字.


Lig*_*ica 13

这个C99特性 C++自己的语义有效地覆盖,可以是任何其他"继承"的特性:

[C++11: 8.3.4/1]:在具有表格的声明T DD

D1[ constant-expression opt ] attribute-specifier-seq opt

[..]

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

请注意,"与C兼容"条款中未提及此差异C.1.

  • 我认为它甚至不是"覆盖" - C功能不是通过继承在C++中,它们在组合和曝光中存在.没有在C++标准中明确提到的任何C特性都不存在,就像C++"从C继承"一样,但恰巧包含类似的文本.但作者显然有动力在可能的地方提供C功能,并且他们认为这些功能并不愚蠢. (6认同)
  • 从海湾合作委员会的角度来看,这并不是"所有警告"的问题,而是"你希望我编写什么语言".如果你不说'-pedantic`然后你没有编译C++,那么你正在编译C++ - with-extensions.如果你说`std = gnu ++ 0x`你会得到扩展*和*语言变化与标准相矛盾而不是有效地扩展它.我认为编译器编写者不会将其作为默认值,因为他们认为首先扩展语言是一个好主意(傲慢和抱怨的客户的组合). (3认同)

Hap*_*aps 8

对于两种语言,constant-expression的定义是不同的.

const size_t size = 5;
int array[size]; // array in C++, VLA in C
Run Code Online (Sandbox Code Playgroud)