C++ 编译器中的可变长度数组 (VLA)

Variable Length Array (VLA) in C++ compilers

我们已经知道,VLA(在 C99 中标准化)不是 C++ 标准的一部分。

所以下面的代码在C++中是"illegal":

void foo(int n) {
  int vla[n];
  for (int i = 0; i < n; ++i) {
    vla[i] = i;
  }
}

尽管如此,编译器(g++clang++接受 代码有效语法,仅生成 warning in case -pedantic flag is enable.

ISO C++ forbids variable length array ‘vla’ [-Wvla]

我的问题是:

Why does the compiler accept that declaration?

因为它的作者选择让它这样做。

GCC 特别允许,默认情况下,许多非标准的东西在历史上被旧的 C 编译器接受。从这个意义上说,他们喜欢 "compatibility"。

What does the standard say about [it]?

正如警告中所说的那样:ISO C++ 禁止可变长度数组。

C++ 没有 VLA。

你看到一个被接受的地方,它是一个编译器扩展;要了解编译器如何实现这样的扩展,您必须询问编译器的作者(或检查其源代码,如果适用)。

标准要求符合标准的编译器在遇到非法内容时必须"issue a diagnostic"。完成后,可以自由地继续编译具有特定于实现意义的代码。 (请注意 "with an implementation-specific meaning" 是 "with undefined behavior" 的礼貌形式)。